也许是monad用法的例子

Asl*_*986 4 monads haskell

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


ДМИ*_*КОВ 8

对于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)