2

モナドについて頭を悩ませようとしているだけです...

現時点でこのページを見ている: 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) )

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

4

3 に答える 3

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

そして、あなたはそれを持っています。

于 2012-05-06T19:53:35.150 に答える
4

の振る舞いはfailモナドに依存します。Maybeモナドでは、 をfail返しますNothing

instance Monad Maybe where
  return = Just

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

  fail _ = Nothing

ただし、他の多くのモナドでは、デフォルトの実装であるため、 にfail変換されます。error独自のものを提供するモナドfailは通常、モナド内にあるreturnMonadPlusを持つことができるクラス内のものです。failmzeroNothingMaybe

fail実際には、それが何をするのかが非常に不明確であるため、使用することはお勧めしません。代わりに、あなたがいるモナドの適切な失敗メカニズムを使用してmzeroくださいthrowError

于 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 に答える