理解(>> =).(>> =)

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)

最后,我们重命名km,iajb2了,我们结束了

(>>=) . (>>=) :: Monad m => m a -> (m b2 -> (a -> m b2) -> b) -> (a -> m b2) -> b
Run Code Online (Sandbox Code Playgroud)