gpt4 book ai didi

haskell - 理解 (>>=) 。 (>>=)

转载 作者:行者123 更新时间:2023-12-04 22:40:06 26 4
gpt4 key购买 nike

我试图理解 (>>=).(>>=) ,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 .
现在我们的外部单子(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)

现在设置 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

最后,我们重命名 km , iajb2 ,我们最终得到
(>>=) . (>>=) :: Monad m => m a -> (m b2 -> (a -> m b2) -> b) -> (a -> m b2) -> b

关于haskell - 理解 (>>=) 。 (>>=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com