理解 (>>=) 。 (>>=)
Understanding (>>=) . (>>=)
我正在尝试理解 (>>=).(>>=)
,GHCi 告诉我的是:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(>>=).(>>=) :: Monad m => m a -> (m b -> (a -> m b) -> b1) -> (a -> m b) -> b1
您能否提供有关如何得出结果的逐步说明?
这个组合曾经被使用过吗?
更新:
我可以锻炼 fmap.fmap
但不能退出 (>>=).(>>=)
,我可以达到 (.)(>>=) :: Monad m => (a1 -> m a) -> a1 -> (a -> m b) -> m b
但事后事情开始变得有点混乱。任何帮助将不胜感激,只是想在这里学习。
TL;DR:我们在中间使用 ((->) r
monad 实例。
我们得看看(.) (>>=)
。所以让我们先重复一下类型:
(>>=) :: Monad m => m a -> ((a -> m b) -> m b)
(.) :: (y -> z ) -> (x -> y) -> (x -> z)
因此,我们有
(.) (>>=) :: 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
现在,我们插入另一个(>>=)
:
(.) (>>=) :: Monad m => (x -> m a ) -> x -> (a -> m b) -> m b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
但是现在我们遇到了问题。我们在同一位置有 Monad m => m a
和 ((i -> k j) -> k j)
。这可能吗?好吧,如果
有一个 monad 实例是可能的
Monad k => (->) (i -> k j)
原来还有一个,就是
instance Monad ((->) r)
对于任何 r
。
现在我们的外部单子 m
是 ((->) (i -> k j)
,因此我们用 (i -> k j) ->
:
替换所有出现的 m
(.) (>>=) :: (x -> (i -> k j) -> a) -> x -> (a -> (i -> k j) -> b) -> (i -> k j) -> b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
现在设置 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
最后,我们将 k
重命名为 m
,将 i
重命名为 a
,将 j
重命名为 b2
,最后得到
(>>=) . (>>=) :: Monad m => m a -> (m b2 -> (a -> m b2) -> b) -> (a -> m b2) -> b
我正在尝试理解 (>>=).(>>=)
,GHCi 告诉我的是:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(>>=).(>>=) :: Monad m => m a -> (m b -> (a -> m b) -> b1) -> (a -> m b) -> b1
您能否提供有关如何得出结果的逐步说明?
这个组合曾经被使用过吗?
更新:
我可以锻炼 fmap.fmap
但不能退出 (>>=).(>>=)
,我可以达到 (.)(>>=) :: Monad m => (a1 -> m a) -> a1 -> (a -> m b) -> m b
但事后事情开始变得有点混乱。任何帮助将不胜感激,只是想在这里学习。
TL;DR:我们在中间使用 ((->) r
monad 实例。
我们得看看(.) (>>=)
。所以让我们先重复一下类型:
(>>=) :: Monad m => m a -> ((a -> m b) -> m b)
(.) :: (y -> z ) -> (x -> y) -> (x -> z)
因此,我们有
(.) (>>=) :: 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
现在,我们插入另一个(>>=)
:
(.) (>>=) :: Monad m => (x -> m a ) -> x -> (a -> m b) -> m b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
但是现在我们遇到了问题。我们在同一位置有 Monad m => m a
和 ((i -> k j) -> k j)
。这可能吗?好吧,如果
Monad k => (->) (i -> k j)
原来还有一个,就是
instance Monad ((->) r)
对于任何 r
。
现在我们的外部单子 m
是 ((->) (i -> k j)
,因此我们用 (i -> k j) ->
:
m
(.) (>>=) :: (x -> (i -> k j) -> a) -> x -> (a -> (i -> k j) -> b) -> (i -> k j) -> b
(>>=) :: Monad k => k i -> ((i -> k j) -> k j)
现在设置 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
最后,我们将 k
重命名为 m
,将 i
重命名为 a
,将 j
重命名为 b2
,最后得到
(>>=) . (>>=) :: Monad m => m a -> (m b2 -> (a -> m b2) -> b) -> (a -> m b2) -> b