>> 在 Haskell 中的正确用法

Correct Usage of >> in Haskell

刚刚在 Haskell 中介绍了 monad,并遇到了 >> 的障碍。

>>= 对我来说很有意义,因为我可以从 Prelude 中得到以下内容:

Prelude> Just 1 >>= (\ x -> Just (x+1))
Just 2

我的理解是>>和bind是一样的,只是在函数参数不变的情况下使用。但是当我尝试在 Prelude 中这样做时:

Prelude> Just 1 >> (\_ -> Just 10)

<interactive>:7:12: error:
• Couldn't match expected type ‘Maybe b’
              with actual type ‘t0 -> Maybe Integer’
• The lambda expression ‘\ _ -> Just 10’ has one argument,
  but its type ‘Maybe b’ has none
  In the second argument of ‘(>>)’, namely ‘(\ _ -> Just 10)’
  In the expression: Just 1 >> (\ _ -> Just 10)
• Relevant bindings include
    it :: Maybe b (bound at <interactive>:7:1)

我很难破译这个错误消息...任何人都可以帮助正确使用 >> 吗?我有什么不明白的?

(>>=) 的类型为 Monad m => m a -> (a -> m b) -> m b。在你的例子中 mMaybe 所以你提供了一个 Maybe Int 和一个函数 Int -> Maybe Int.

(>>) 有类型 Monad m => m a -> m b -> m b 所以你需要传递一个 Maybe b 而不是一个 returns 一个 Maybe b 的函数,例如

Just 1 >> Just 10

在这种情况下,这与 Just 10 相同,但是如果第一个值是 Nothing,结果也将是 Nothing:

Nothing >> Just 10

如果第一个值表示您想要执行的某些效果并忽略结果,您通常会使用 (>>),例如 IO.

putStrLn "Hello world" >> pure 10 :: IO Int

State

put "state" >> pure 10 :: State String Int