5

重複の可能性:
Haskell のリスト内包表記では、パターン マッチが失敗したときにエラーが発生しないのはなぜですか?

今日、私は次のコードを見ました:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]

できます。しかし、上記のリスト内包表記は構文糖衣にすぎないと思いました...

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)

... Haskell が に遭遇するとNothing、エラーを出力します*** Exception: Non-exhaustive patterns in lambda

だから私の質問は次のとおりです。[a | Just a <- [Just 10, Nothing, Just 20]](モナドコードの観点から)何に変換されNothingますか?

4

1 に答える 1

2

その他の質問の最良の答えは、実際には「コンパイラの魔法」を参照するものだと思います。あなたはパターンに一致しています.Haskell 2010レポートJust xによると、動作は次のように指定されています

.. 一致が失敗した場合、リストのその要素は単純にスキップされます。

したがって、実装は好きなようにこれを自由に行うことができると思います (つまり、脱糖は必ずしも一意ではありません)。

于 2012-07-30T22:55:46.243 に答える