也许是monad用法的例子

时间:2012-06-04 13:01:00

标签: haskell monads

我正在尝试学习Haskell,但我在monad使用方面遇到了问题。

我导入了模块Data.Maybe

但我不知道如何使用>>=运算符。

鉴于(>>=) :: Monad m => m a -> (a -> m b) -> m b,我无法理解如何定义函数(a -> m b)

有人可以提供一些教学示例吗?

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

对于Maybe monad绑定函数(>>=)看起来像这样:

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b

所以,让我们定义一些Maybe a值:

> let a = Just 1
a :: Maybe Integer

:: a -> Maybe b功能:

> let f = \x -> Just (x+1)
f :: Integer -> Maybe Integer

现在我们可以使用bind like infix operator:

> a >>= f
Just 2
it :: Maybe Integer

真正a -> Maybe b函数的另一个例子可能是:

let h :: Integer -> Maybe String; h = return . show . (+1)
h :: Integer -> Maybe String

所以h增加整数,将其转换为字符串并生成Maybe值 具有return功能。

> a >>= h
Just "2"
相关问题