我正在尝试学习Haskell,但我在monad使用方面遇到了问题。
我导入了模块Data.Maybe
。
但我不知道如何使用>>=
运算符。
鉴于(>>=) :: Monad m => m a -> (a -> m b) -> m b
,我无法理解如何定义函数(a -> m b)
。
有人可以提供一些教学示例吗?
答案 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"