33

このコードには問題があります。文字列内の同じ文字の最長部分文字列をカウントする必要がありますが、エラーがあります。

*** Exception: test.hs:(15,0)-(21,17): 
Non-exhaustive patterns in function countLongest'

それが間違った型の問題であることは知っていますが、エラーがどこにあるのか、またはそれを見つけてデバッグする方法はわかりません

countLongest :: (Eq a) => [a] -> Int
countLongest' :: (Eq a) => Int -> Int -> [a] -> Int

countLongest a = countLongest' 0 0 a
countLongest' n max (y:x:ys)
        | y == x = countLongest' (n+1) max (x:ys)
        | n > max = countLongest' 0 (n) (x:ys)
        | otherwise = countLongest' 0 (max) (x:ys)
countLongest' n max []
        | n > max = n
        | otherwise = max
4

2 に答える 2

48

要素リストが 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.

涼しい!コンパイラはかなり賢いです!

于 2011-12-08T18:15:41.973 に答える
4

問題は、再帰に 1 つの要素が残っている場合に一致する必要があることです。次に例を示します。

countLongest' n max (y:ys)

最初の要素は 2 つ以上の要素が残っている場合に一致し、最後の要素は要素が残っていない場合にのみ一致するためです。

于 2011-12-08T18:16:06.320 に答える