haskell - 也许单子(monad)用法示例

标签 haskell monads

我正在尝试学习 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/

相关文章:

Haskell 字符串操作

haskell - 哈基尔说 "Dependency cycle detected: ..."

haskell - 我们可以用 Alternative 做什么,但不能用 Monoid 做什么?

monads - 将 Show 实例添加到 RWH 的 RandomState 示例

Haskell monad 返回任意数据类型

javascript - 单子(monad)组合练习错误

list - Haskell获取IO列表元素

haskell - 无法写入标准输入

haskell - 为什么只允许 Haskell 中的函数使用隐含多态性?

haskell - 不使用 monad 进行表示法 : possible?