不完全なパターンについての警告
GHC に不完全なパターンがあった場合警告する -fwarn-incomplete-patterns というオプションがあります。
【例】
test [] = "" test (a:b:c:rest) = show a ++ show b ++ show c ++ test rest
-fwarn-incomplete-patterns オプションを付けない場合。
PS C:\card> ghci test.hs Main> test [1,2,3] "123" Main> test [1,2,3,4,5] "123*** Exception: test.hs:(1,0)-(2,58): Non-exhaustive patterns in function test
3に満たない長さが残った場合該当するパターンがないのです。
-fwarn-incomplete-patterns というオプションを付けると警告が出ます。
PS C:\card> ghci -fwarn-incomplete-patterns test.hs GHCi, version 6.10.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Main ( test.hs, interpreted ) test.hs:1:0: Warning: Pattern match(es) are non-exhaustive In the definition of `test': Patterns not matched: [_] [_, _] Ok, modules loaded: Main.
リストの要素がひとつのときとふたつのときにマッチしないよ、って言ってるようです。
test [] = "" test [a] = show a -- 要素がひとつのときを追加 test [a,b] = show a ++ show b -- 要素がふたつのときを追加 test (a:b:c:rest) = show a ++ show b ++ show c ++ test rest
これで警告も消え、エラーもでなくなりました。
PS C:\card> ghci -fwarn-incomplete-patterns test.hs GHCi, version 6.10.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. [1 of 1] Compiling Main ( test.hs, interpreted ) Ok, modules loaded: Main. Main> test [1,2,3,4,5] "12345" Main> test [1] "1"
オプションはソースの先頭に書けるようです。
4.1.2. ソースファイル中のコマンド行オプション
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} test [] = "" test [a] = show a -- 要素がひとつのときを追加 test [a,b] = show a ++ show b -- 要素がふたつのときを追加 test (a:b:c:rest) = show a ++ show b ++ show c ++ test rest