>> 在 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
。在你的例子中 m
是 Maybe
所以你提供了一个 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
刚刚在 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
。在你的例子中 m
是 Maybe
所以你提供了一个 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