gpt4 book ai didi

Haskell >>= 操作 : why is the function argument required to return another Monad?

转载 作者:行者123 更新时间:2023-12-03 15:18:13 24 4
gpt4 key购买 nike

考虑表达式:

[0,1..] >>= \i -> [i * 2]

>>= 的定义中对于 List,lambda 函数 \i -> [i * 2]通过 fmap 映射到列表参数,产生列表列表 [[0], [2]..] .所以 >>=需要使用连接函数将结果展平以返回列表: [0, 2..]
根据 this source : "...根据 fmap 和 join 定义的绑定(bind)适用于每个 monad m: ma >>= k = join $ fmap k ma"

那么,为什么有必要将返回 monad 的负担放在提供给 >>= 的函数上呢?为什么不简单地定义 bind 像这样?
ma >>= k = fmap k ma

这样你就不必处理结果的扁平化。

最佳答案

您的建议是简单地将绑定(bind)运算符定义为等于 fmap ,但交换了参数:

ma >>= k = fmap k ma
-- is equivalent to:
(>>=) = flip fmap

在这种情况下,为什么不直接使用 fmap本身,或其运算符形式 <$> ?
(*2) <$> [0,1..]
> [0,2,4,6,...]

但是,这并不涵盖 bind 的所有情况。可能用过了。不同之处在于 monad 比 functor 更强大。仿函数只能让你为每个输入产生一个输出,而 monad 可以让你做各种疯狂的事情。

例如,考虑以下内容:
[0,1,2,3] >>= \i -> [i*2, i*3]
> [0,0,2,3,4,6,6,9]

在这里,该函数为每个输入生成两个值。这不能仅通过 fmap 来表达.这需要 join荷兰国际集团的结果值。

这是另一个更不明显的例子:
[0,1,2,3,4,5] >>= \i -> if i `mod` 2 == 0 then [] else [i]
> [1,3,5]

在这里,函数要么产生一个值,要么不产生。空列表在技术上仍然是 List monad 中的一个值,但无法通过 fmap 获得荷兰国际集团的输入。

关于Haskell >>= 操作 : why is the function argument required to return another Monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317243/

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