2

只是想让我的头绕着单子......

目前正在查看此页面:http ://www.haskell.org/haskellwiki/Simple_monad_examples

在底部,它询问这些片段解析为:

Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )

为什么这什么都不返回?因为调用失败?

Nothing >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )

我理解这一点。

4

3 回答 3

8

在 Haskell 中,您通常可以通过内联和术语重写来理解一些代码:

我们有:

Prelude> Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )
Nothing

我们需要的最重要的事情是 monad 的定义和定义,如下所示fail>>=Maybe

instance  Monad Maybe  where
    (Just x) >>= k      = k x
    Nothing  >>= _      = Nothing

    (Just _) >>  k      = k
    Nothing  >>  _      = Nothing

    return              = Just
    fail _              = Nothing

所以我们有:

Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )

-- by definition of >>=
(\ x -> if (x == 0) then fail "zero" else Just (x + 1) ) 0

-- by definition of fail
(\ x -> if (x == 0) then Nothing else Just (x + 1) ) 0

-- beta reduce
if 0 == 0 then Nothing else Just (0 + 1)

-- Integer math
if True then Nothing else Just 1

-- evaluate `if`
Nothing

你有它。

于 2012-05-06T19:53:35.150 回答
4

的行为fail取决于单子。在Maybemonad 中,fail返回Nothing.

instance Monad Maybe where
  return = Just

  (Just x) >>= k = k x
  Nothing  >>= _ = Nothing

  fail _ = Nothing

但是,在许多其他 monad中,它会fail转换为error,因为这是默认实现。提供自己的单子fail通常是类中的单子MonadPlus,您可以在其中使用单子中的failreturn 。mzeroNothingMaybe

在实践中,我不建议使用fail它,因为它会做什么还不清楚。相反,请使用您所在的 monad 的适当故障机制,无论是mzerothrowError还是其他。

于 2012-05-06T19:48:39.197 回答
2

是的,因为调用失败。看看 Maybe 如何是 Monad 类型类的一个实例:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/Data-Maybe.html#Maybe

fail _              = Nothing
于 2012-05-06T19:44:27.153 回答