哈斯克尔:(也许)monad建筑

use*_*349 2 monads haskell maybe

我目前正在努力研究Haskell的新元素:Monads.因此,我通过一个创建>> =运算符的例子介绍了这个例子,该运算符只在不等于Nothing的情况下执行可能类型的函数(将其实际的整数值作为参数),否则返回Nothing:

(>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
Nothing >>= _ = Nothing
(Just x) >>= f = f x
Run Code Online (Sandbox Code Playgroud)

但是,我不太确定它如何与以下用法一起使用:

eval (Val n) = Just n
eval (Div x y) = eval x >>= (\n ->
    eval y >>= (\m ->
        safediv n m))
Run Code Online (Sandbox Code Playgroud)

在我看来,(>> =)运算符只需要一个Maybe值和一个返回一个的函数,但是在这个例子中,使用代码看起来好像是一个可能值的2倍和一个函数.然而我被告知它评估x,将结果放入n,然后计算y,将结果放入y,然后在两者上执行safediv函数.虽然我没有看到(>> =)运算符在这里扮演什么角色; 这是如何运作的?

如果有人能帮我解决这个问题,我将不胜感激.

提前致谢!

最好的问候,Skyfe.

Car*_*ten 6

你可以这样读:

eval (Div x y) = eval x >>= (\n ->
    eval y >>= (\m ->
        safediv n m))
Run Code Online (Sandbox Code Playgroud)

当你想要的eval (Div x y)

  • 第一eval x:
    • 如果是Just n(使用第一个>> =)
    • 然后拿走n并看看eval y(使用第一个>> =)
      • 如果是最后一个Just m(第二个>> =)
      • 然后拿走m并做一个(第二个>> =)
      • savediv n m返回它的结果 - 你仍然有n你的关闭!

在其他任何回归中 Nothing

所以这里(>>=)只是帮助你解构.

也许在do表单中阅读和理解更容易:

eval (Val n) = Just n
eval (Div x y) = do
    n <- eval x
    m <- eval y
    safediv n m
Run Code Online (Sandbox Code Playgroud)

这只是语法糖 (>>=)

让我们追逐案例:

1. eval x = Nothingeval y = Nothing:
eval x >>= (...) = Nothing >>= (...) = Nothing
Run Code Online (Sandbox Code Playgroud) 2. eval x = Nothingeval y = Just n:

这是一样的:

eval x >>= (...) = Nothing >>= (...) = Nothing
Run Code Online (Sandbox Code Playgroud) 3. eval x = Just neval y = Nothing:
eval x >>= (\n -> eval y >>= (...))
= Just n >>= (\n -> eval y >>= (...)) 
= Just n >>= (\n -> Nothing)
= Nothing
Run Code Online (Sandbox Code Playgroud) 4. eval x = Just neval y = Just m:
eval x >>= (\n -> Just m >>= (...))
= Just n >>= (\n -> Just m >>= (...)) 
= Just n >>= (\n -> Just m >>= (\m -> safediv n m))
= (first >>= for Just) = Just m >>= (\n -> safediv n m)
= (second >>= for Just) = safediv n m
Run Code Online (Sandbox Code Playgroud)