4 monads haskell function-composition
我想了解(>>=).(>>=),GHCi告诉我的是:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(>>=).(>>=) :: Monad m => m a -> (m b -> (a -> m b) -> b1) -> (a -> m b) -> b1
Run Code Online (Sandbox Code Playgroud)
你能提供一步一步解释结果的来源吗?
这种作品曾被使用过吗?
更新:
我能够解决fmap.fmap但不能退出(>>=).(>>=),我能够达到(.)(>>=) :: Monad m => (a1 -> m a) -> a1 -> (a -> m b) -> m b但后事情开始变得有些混乱.任何帮助将不胜感激,只是想在这里学习.
Zet*_*eta 10
TL; DR:我们在((->) r中间使用monad实例.
我们要看一下(.) (>>=).那么让我们先重复一下类型:
(>>=) :: Monad m => m a -> ((a -> m b) -> m b)
(.) :: (y -> z ) -> (x -> y) -> (x -> z)
Run Code Online (Sandbox Code Playgroud)
因此,我们有
(.) (>>=) :: Monad m => (x -> m a) -> (x -> ((a -> m b) -> m b))
-- or, with less parentheses
(.) (>>=) :: Monad m => (x -> m a) -> x -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
现在,我们插入另一个(>>=):
(.) (>>=) :: Monad m => (x -> m a ) -> x -> (a -> m b) -> m b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
Run Code Online (Sandbox Code Playgroud)
但现在我们遇到了问题.我们已经Monad m => m a和((i -> k j) -> k j)在相同的位置.这甚至可能吗?好吧,如果有一个monad实例,它是可能的
Monad k => (->) (i -> k j)
Run Code Online (Sandbox Code Playgroud)
原来有一个,即
instance Monad ((->) r)
Run Code Online (Sandbox Code Playgroud)
任何r.现在我们的外部monad m是((->) (i -> k j),因此我们替换所有出现m的(i -> k j) ->:
(.) (>>=) :: (x -> (i -> k j) -> a) -> x -> (a -> (i -> k j) -> b) -> (i -> k j) -> b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
Run Code Online (Sandbox Code Playgroud)
现在设定x ~ k i,a ~ k j我们最终结束
(.) (>>=) :: (x -> (i -> k j) -> a) -> x -> (a -> (i -> k j) -> b) -> (i -> k j) -> b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
(>>=) . (>>=) :: Monad k => k i -> (k j -> (i -> k j) -> b) -> (i -> k j) -> b
Run Code Online (Sandbox Code Playgroud)
最后,我们重命名k来m,i来a和j到b2了,我们结束了
(>>=) . (>>=) :: Monad m => m a -> (m b2 -> (a -> m b2) -> b) -> (a -> m b2) -> b
Run Code Online (Sandbox Code Playgroud)