gpt4 book ai didi

haskell - 试图理解 Monad。 >> 运算符

转载 作者:行者123 更新时间:2023-12-02 07:09:21 25 4
gpt4 key购买 nike

我是 Haskell 新手,我正在通过 LearnYouAHaskell 学习。我只是无法理解 (>>) 运算符背后的原因。
默认实现是:

(>>) :: (Monad m) => m a -> m b -> m b  
m >> n = m >>= \_ -> n

(据我所知)忽略第一个值并返回第二个值。但是,从 LearnYouAHaskell 中的示例来看,会发生这种情况:

ghci> Nothing >> Just 3
Nothing
ghci> Just 3 >> Nothing
Nothing

所以它不会忽略第一个值。然而,通过一点研究,我发现了这句话 here

The >> function binding operator ignores the value of its first action and returns as an overall result the result of its second action only.

所以我对这个运算符的使用感到困惑,我想问两件事:

  1. 它实际上有什么作用
  2. 什么时候有用?

最佳答案

>> 函数仅忽略第一个值的结果,但它不会忽略第一个值的副作用。要理解您的示例,请参阅如何定义 Maybe Monad:

instance Monad Maybe where
return = Just
(Just x) >>= f = f x
Nothing >>= _ = Nothing

>>函数的定义如下:

m >> k      = m >>= \_ -> k

Nothing >> _ 将根据 Maybe monad 的定义生成 Nothing。在第二个示例中, Just 3 >> Nothing 扩展为 Just 3 >>=\_ -> Nothing 并产生 Nothing 。为了给您提供一个示例,说明它如何仅忽略第一个操作的值,但不忽略副作用,请考虑以下示例:

λ> print 3 >> print 4
3
4

在上面的例子中你可以看到,虽然它忽略了print 3的结果,即(),但它并没有忽略它的副作用,即()就是在屏幕上显示3

一旦您开始使用其他 Haskell 库,

>> 函数就会变得有用。我偶尔使用它们的两个地方是处理解析器(parsec、attoparsec)和管道库时。

关于haskell - 试图理解 Monad。 >> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24847822/

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