刚刚介绍给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)
我非常努力破译此错误消息......任何人都可以帮助正确使用>>
吗?我不明白它是什么?
答案 0 :(得分:2)
(>>=)
的类型为Monad m => m a -> (a -> m b) -> m b
。在您的示例中,m
为Maybe
,因此您提供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