如何在 Haskell 中使用 "bind" 关键字代替“>>=”运算符
How to use "bind" keyword instead of ">>=" operator in Haskell
我试图理解 Haskell monads 并编写了这个测试程序,它按预期编译和工作:
divide :: Int -> Int -> Either String Int
divide _ 0 = Left "Divide by zero error
divide numerator denom = Right (numerator `div` denom)
processNumsMonadically :: Int -> Int -> Either String Int
processNumsMonadically n d = divide n d >>= \q -> return (q+1)
当我尝试在后一个函数定义中使用单词 bind
而不是 >>=
运算符时:
processNumsMonadically n d = bind (divide n d) (\q -> return (q+1))
我收到错误:
Not in scope: 'bind'
bind
这个词的正确用法是什么?
这不是 Prelude 的一部分;它位于 Control.Monad.Extra
,monad-extras
包的一部分。
但是,您可以轻松地以前缀方式调用运算符(如命名函数):
processNumsMonadically n d = (>>=) (divide n d) (\q -> return (q+1))
您也可以只使用 do
表示法:
processNumsMonadically n d = do
q <- divide n d
return (q+1)
但是当我们这样做时,我会使用 Functor 来编写:
processNumsMonadically n d = fmap (+1) (divide n d)
或应用语法:
processNumsMonadically n d = (+1) <$> divide n d
您也可以 lift
+1
以避免需要 return
和 lambda。
作为个人风格的评论,bind
用作一个词并不惯用,恕我直言,您不应该使用它。
我试图理解 Haskell monads 并编写了这个测试程序,它按预期编译和工作:
divide :: Int -> Int -> Either String Int
divide _ 0 = Left "Divide by zero error
divide numerator denom = Right (numerator `div` denom)
processNumsMonadically :: Int -> Int -> Either String Int
processNumsMonadically n d = divide n d >>= \q -> return (q+1)
当我尝试在后一个函数定义中使用单词 bind
而不是 >>=
运算符时:
processNumsMonadically n d = bind (divide n d) (\q -> return (q+1))
我收到错误:
Not in scope: 'bind'
bind
这个词的正确用法是什么?
这不是 Prelude 的一部分;它位于 Control.Monad.Extra
,monad-extras
包的一部分。
但是,您可以轻松地以前缀方式调用运算符(如命名函数):
processNumsMonadically n d = (>>=) (divide n d) (\q -> return (q+1))
您也可以只使用 do
表示法:
processNumsMonadically n d = do
q <- divide n d
return (q+1)
但是当我们这样做时,我会使用 Functor 来编写:
processNumsMonadically n d = fmap (+1) (divide n d)
或应用语法:
processNumsMonadically n d = (+1) <$> divide n d
您也可以 lift
+1
以避免需要 return
和 lambda。
作为个人风格的评论,bind
用作一个词并不惯用,恕我直言,您不应该使用它。