2011-07-15 5 views

答えて

20

まあ、私はそれはそれが言うことを意味すると仮定 - パターンは一致しませんが、代替はありません。この例:

But for the program:

g x = let Just y = f x in h y 

GHC reports:

Main: M1.hs:9:11-22: 
    Irrefutable pattern failed for pattern Data.Maybe.Just y 

Indicating the source of the failure.

http://www.haskell.org/haskellwiki/Debugging

から、実施例の点を付属はf x戻りNothingならば、GHCはyに値を割り当てることができる方法がないことです。

19

この例を考えてみます。

foo ~(Just x) = "hello" 
main = putStrLn $ foo Nothing 

これは反論できないパターン(~部分)を使用します。反駁可能なパターンは常に「一致」するので、これはhelloを出力します。

foo ~(Just x) = x 
main = putStrLn $ foo Nothing 

さて、パターンはまだマッチが、私たちはxを使用しようとしたとき、それが実際にはありませんでしたときに我々は反論できないパターンマッチエラーを得た:

Irr.hs: /tmp/Irr.hs:2:1-17: Irrefutable pattern failed for pattern (Data.Maybe.Just x) 

これは微妙に異なっています一致するパターンがありませんときに取得エラー:

foo (Just x) = x 
main = putStrLn $ foo Nothing 

これは

を出力10
Irr.hs: /tmp/Irr.hs:2:1-16: Non-exhaustive patterns in function foo 

もちろん、これはやや工夫した例です。可能性の高い説明は、letバインディングのパターンから来ているということです。as chrisdb suggested

+0

を、私はそれが間違って '〜xyz'かもしれないと思うが(IMOそれは*怠惰なパターン*と呼ばれています)一例であり、唯一のものではない - 私は、人々が '〜' **反駁可能なパターン – Carsten

6

他の人が言っていることを追加するには、あなたが意図しているものよりも小さいリストを切断する場合、技術的にそれを得ることができます。例えば、(GHCiの中で):

Prelude> let l = [1,2,3] 
Prelude> let (x:x1:xs) = l 
Prelude> x 
1 

が正常に動作しますが、あなたがやった場合:

Prelude> let l2 = [1] 
Prelude> let (x:x1:xs) = l2 
Prelude> x 
*** Exception: <interactive>:294:5-18: Irrefutable pattern failed for pattern (x : x1 : xs) 
+0

*を解体しているのを見ているので、ちょっと言います。 –

関連する問題