我正在尝试学习 Haskell,但我在使用 monad 时遇到了问题。
我导入了模块 Data.Maybe
.
但我不知道如何使用 >>=
运算符(operator)。
给定 (>>=) :: Monad m => m a -> (a -> m b) -> m b
我不明白如何定义函数 (a -> m b)
.
有人可以提供一些教学示例吗?
最佳答案
Maybe monad 的一个相当常见的例子是除法。在某些方面,Maybe monad 表示一个计算要么给出结果(Just
)要么失败(Nothing
),除法就是这样:除非你除以 0,否则它是有效的,在这种情况下它是失败的.
代码总是有用的:
divide :: (Fractional a) => a -> a -> Maybe a
divide a 0 = Nothing
divide a b = Just $ a / b
使用此功能的一些示例:
> divide 1 2
Just 0.5
> divide 20 3
Just 6.666666666666667
> divide 1 0 -- Oops
Nothing
因为 Maybe 是一个 monad,我们可以使用这个
divide
进行计算。功能并自动传播任何错误。例如。以下计算 1/x + 1
安全地recipPlusOne :: (Fractional a) => a -> Maybe a
recipPlusOne x = divide 1 x >>= return . (+1)
-- equivalently,
recipPlusOne' x = fmap (+1) $ divide 1 x
(注意
return . (+1)
是一个函数 a -> m b
,因为它接受一个数字,加一个( (+1)
),然后将它包装在 Maybe monad 中( return
)。)错误通过传播,
> recipPlusOne 1
Just 2.0
> recipPlusOne 0.1
Just 11.0
> recipPlusOne 0 -- Oops, divide by 0
Nothing
关于haskell - 也许单子(monad)用法示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10881785/