Haskell了解Monads

时间:2012-05-06 19:38:44

标签: haskell monads

试图让我的头围绕monad ...

目前正在查看此页面: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) )

我理解这一点。

3 个答案:

答案 0 :(得分:8)

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

我们有:

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

我们需要的最重要的事情是为fail monad定义>>=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

你有它。

答案 1 :(得分:4)

fail的行为取决于monad。在Maybe monad中,fail返回Nothing

instance Monad Maybe where
  return = Just

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

  fail _ = Nothing

但是,在许多其他monad fail转换为error,因为这是默认实现。提供自己的fail的monad通常是MonadPlus类中的monad,您可以fail返回mzeroNothing位于Maybe {1}} monad。

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

答案 2 :(得分:2)

是的,因为失败的电话。看看Maybe是Monad类型类的实例:

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

fail _              = Nothing