正确使用>>在哈斯克尔

时间:2017-10-04 10:10:09

标签: haskell types typeerror monads ghci

刚刚介绍给Haskell的Monads并用>>点击了一些障碍。

>>=对我有意义,因为我可以从前奏中得到以下内容:

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)

我非常努力破译此错误消息......任何人都可以帮助正确使用>>吗?我不明白它是什么?

1 个答案:

答案 0 :(得分:2)

(>>=)的类型为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而不是返回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