要素リストが 1 つの場合を見落としているようです。
countLongest' n max (y:ys)
| ... etc. ...
| otherwise = ....
あなたに似た不自然な例を次に示します。
f [] = 3 -- matches an empty list
f (a:b:bs) = 4 -- matches a list with at least two elements
例:
Prelude> :load myfile.hs
[1 of 1] Compiling Main ( myfile.hs, interpreted )
Ok, modules loaded: Main.
*Main> f [3]
*** Exception: myfile.hs:(3,0)-(4,13): Non-exhaustive patterns in function f
*Main> f []
3
*Main> f [1,2,3,4,5]
4
*Main>
したがって、リスト内の要素が 0 と 2 の場合は成功しますが、要素が 1 つだけの場合は失敗します。
この動作はリストに固有のものではないことに注意してください。を使用した例を次に示しMaybe
ます。
g :: Maybe x -> x
g (Just x) = x
例:
*Main> g (Just 4)
4
*Main> g Nothing
*** Exception: myfile.hs:6:0-13: Non-exhaustive patterns in function g
Maybe
これは、Just <something>
との 2 つのコンストラクターがあるために発生しましたNothing
。のケースを提供しなかったNothing
ので、それを に渡したとき、うまくいきg
ませんでした!
この質問とその回答をチェックして、コンパイラから少し助けを得ることについての情報を入手してください。最初の回答のアドバイスに従いました。例をロードすると、次のようになりました。
prompt$ ghci -fwarn-incomplete-patterns
Prelude> :load myfile.hs
[1 of 1] Compiling Main ( myfile.hs, interpreted )
myfile.hs:3:0:
Warning: Pattern match(es) are non-exhaustive
In the definition of `f': Patterns not matched: [_]
myfile.hs:6:0:
Warning: Pattern match(es) are non-exhaustive
In the definition of `g': Patterns not matched: Nothing
Ok, modules loaded: Main.
涼しい!コンパイラはかなり賢いです!