gpt4 book ai didi

haskell - 为什么存在bind(>>=)?没有绑定(bind)的解决方案很丑陋的典型情况是什么?

转载 作者:行者123 更新时间:2023-12-03 06:28:28 25 4
gpt4 key购买 nike

这是绑定(bind)方法的类型声明:

(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

我的阅读方式如下:将返回包装值的函数应用于包装值。

此方法作为 Monad 类型类的一部分包含在 Prelude 中。这意味着有很多情况需要它。

好吧,但是我根本不明白为什么这是一个典型案例的典型解决方案。

如果您已经创建了一个返回包装值的函数,为什么该函数尚未采用包装值?

换句话说,有许多函数采用普通值但返回包装值的典型情况是什么? (而不是获取包装值并返回包装值)

最佳答案

值的“展开”正是您在处理 monad 时想要隐藏的内容,因为正是这一点导致了大量的样板文件。

例如,如果您有一系列操作返回您想要组合的 Maybe 值,则如果您收到一个值,则必须手动传播 Nothing:

nested :: a -> Maybe b
nested x = case f x of
Nothing -> Nothing
Just r ->
case g r of
Nothing -> Nothing
Just r' ->
case h r' of
Nothing -> Nothing
r'' -> i r''

这就是绑定(bind)为您所做的事情:

Nothing >>= _ = Nothing
Just a >>= f = f a

所以你可以写:

nested x = f x >>= g >>= h >>= i

某些 monad 根本不允许您手动解压值 - 最常见的示例是 IO。从 IO 获取值的唯一方法是 map>>=,这两种方法都需要您在输出中传播 IO .

关于haskell - 为什么存在bind(>>=)?没有绑定(bind)的解决方案很丑陋的典型情况是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23443072/

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