2012-05-06 15 views
2

だけモナドラウンド私の頭を取得しようとしている... Haskellの理解モナド

は、現時点では、このページを見て:それはこれらのスニペットが解決しないものを尋ね下部に http://www.haskell.org/haskellwiki/Simple_monad_examples

へ:

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

なぜNothingが返されますか?フェイルコールのために?

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

私はこれを理解しています。

+0

確認と説明に感謝します:) – Tobi3

答えて

8

いつものようにHaskellでは、あなたは通常、インライン化や用語書き換えることにより、いくつかのコードを理解することができます

を私たちは持っている:

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

私たちが必要とする最も重要なことは、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 

などあります。

2

はい、フェールコールのためです。

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

fail _    = Nothing 
+0

n.b.あなたはこれを見つけることができます(http://www.haskell.org/hoogle/?hoogle=Maybe)。ドキュメントへの正しいハイパーリンクをたどってから、そのページの「ソース」リンクをクリックしてください。右上の角。 –

4

failの動作はモナドに依存します:モナドの型クラスのインスタンスであるか多分見て。 Maybeモナドでは、failNothingを返します。それはデフォルトの実装であるため、

instance Monad Maybe where 
    return = Just 

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

    fail _ = Nothing 

はしかし、他の多くのモナドでfailは、errorに変換されます。 failを提供するモナドは、通常MonadPlusクラスのものです。ここでfailが返されます。mzeroは、MaybeモナドのNothingです。

failは実際には何をするのか不明なので、実際には使用しないことをおすすめします。代わりに、mzerothrowErrorなどのモナドの適切な障害メカニズムを使用してください。

関連する問題