「パターンに反駁できないパターンが失敗しました」の原因とはどういう意味ですか?
irrefutable pattern failed for pattern
は何を意味するのでしょうか? このランタイムエラーはどのような場合に発生しますか?
「パターンに反駁できないパターンが失敗しました」の原因とはどういう意味ですか?
irrefutable pattern failed for pattern
は何を意味するのでしょうか? このランタイムエラーはどのような場合に発生しますか?
まあ、私はそれはそれが言うことを意味すると仮定 - パターンは一致しませんが、代替はありません。この例:
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
に値を割り当てることができる方法がないことです。
この例を考えてみます。
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
これは
を出力10Irr.hs: /tmp/Irr.hs:2:1-16: Non-exhaustive patterns in function foo
もちろん、これはやや工夫した例です。可能性の高い説明は、let
バインディングのパターンから来ているということです。as chrisdb suggested。
他の人が言っていることを追加するには、あなたが意図しているものよりも小さいリストを切断する場合、技術的にそれを得ることができます。例えば、(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)
*を解体しているのを見ているので、ちょっと言います。 –
を、私はそれが間違って '〜xyz'かもしれないと思うが(IMOそれは*怠惰なパターン*と呼ばれています)一例であり、唯一のものではない - 私は、人々が '〜' **反駁可能なパターン – Carsten