我试图了解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
的正确方法是什么?
答案 0 :(得分:6)
这不是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
用作单词并非惯用,恕我直言,你不应该使用它。