我正在尝试学习Haskell,但我在使用monad时遇到问题.
我导入了模块Data.Maybe.
但我不知道如何使用>>=运营商.
鉴于(>>=) :: Monad m => m a -> (a -> m b) -> m b我无法理解如何定义一个函数(a -> m b).
有人可以提供一些教学示例吗?
huo*_*uon 14
与Maybe monad相关的一个相当常见的例子是除法.在某些方面,Maybe monad表示一个计算,它给出result(Just)或者失败(Nothing),而除法就是这样:除非你除以0,否则它会起作用,在这种情况下它是失败的.
代码总是有用的:
divide :: (Fractional a) => a -> a -> Maybe a
divide a 0 = Nothing
divide a b = Just $ a / b
Run Code Online (Sandbox Code Playgroud)
使用此功能的一些示例:
> divide 1 2
Just 0.5
> divide 20 3
Just 6.666666666666667
> divide 1 0 -- Oops
Nothing
Run Code Online (Sandbox Code Playgroud)
因为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
Run Code Online (Sandbox Code Playgroud)
(请注意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
Run Code Online (Sandbox Code Playgroud)
对于Maybemonad绑定函数(>>=)看起来像这样:
(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Run Code Online (Sandbox Code Playgroud)
所以,让我们定义一些Maybe a值:
> let a = Just 1
a :: Maybe Integer
Run Code Online (Sandbox Code Playgroud)
和:: a -> Maybe b功能:
> let f = \x -> Just (x+1)
f :: Integer -> Maybe Integer
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用bind like infix运算符:
> a >>= f
Just 2
it :: Maybe Integer
Run Code Online (Sandbox Code Playgroud)
真正a -> Maybe b功能的另一个例子可能是:
let h :: Integer -> Maybe String; h = return . show . (+1)
h :: Integer -> Maybe String
Run Code Online (Sandbox Code Playgroud)
所以h增加整数,将其转换为字符串并Maybe使用return函数创建一个值.
> a >>= h
Just "2"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |