如何在 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.Extramonad-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 用作一个词并不惯用,恕我直言,您不应该使用它。