如何在Haskell中使用“bind”关键字而不是“>> =”运算符

时间:2015-03-29 18:28:55

标签: haskell monads

我试图了解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的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

这不是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用作单词并非惯用,恕我直言,你不应该使用它。