只是想让我的头绕成一团...

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

在底部,它询问这些摘要将解决什么:

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

为什么没有返回什么?因为失败 call ?
Nothing >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1) )

我明白这一点。

最佳答案

像在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

就在那里。

关于haskell - Haskell了解单子(monad),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10473631/

10-15 18:24