-Werror
警告をエラーに変えるために使用できます。網羅的ではないパターンの警告だけをエラーに変えることができるかどうかはわかりません。申し訳ありません!
あなたの質問の3番目の部分については:
私はときどき、緊密に連携して動作する傾向があり、Haskell では簡単に表現できないプロパティを持つ多くの関数を作成します。これらの関数の少なくとも一部は、網羅的でないパターンを持つ傾向があり、通常は「消費者」です。これは、たとえば、互いに「一種の」逆である関数で発生します。
おもちゃの例:
duplicate :: [a] -> [a]
duplicate [] = []
duplicate (x:xs) = x : x : (duplicate xs)
removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates [] = []
removeDuplicates (x:y:xs) | x == y = x : removeDuplicates xs
これで、 が(要素の型が にあるときはいつでも )removeDuplicates (duplicate as)
が等しいことを簡単に確認できますが、通常、要素の数が奇数であるか、連続する 2 つの要素が異なるため、クラッシュします。クラッシュしない場合は、そもそもによって作成された (または作成された可能性がある)ためです。as
Eq
duplicate (removeDuplicates bs)
bs
duplicate
したがって、次の法則があります (有効な Haskell ではありません)。
removeDuplicates . duplicate == id
duplicate . removeDuplicates == id (for values in the range of duplicate)
ここで、網羅的でないパターンを防ぎたい場合は、removeDuplicates
returnMaybe [a]
を作成するか、欠落しているケースのエラー メッセージを追加できます。あなたはの線に沿って何かをすることさえできます
newtype DuplicatedList a = DuplicatedList [a]
duplicate :: [a] -> DuplicatedList a
removeDuplicates :: Eq a => DuplicatedList a -> [a]
-- implementations omitted
Haskell 型システムでは「要素の連続したペアが等しい、長さが偶数のリストであること」を簡単に表現できないため、これがすべて必要です (あなたが Oleg でない限り:)
ただし、エクスポートしない場合は、removeDuplicates
ここで網羅的でないパターンを使用してもまったく問題ないと思います。エクスポートするとすぐに、入力を制御できなくなり、欠落しているケースに対処する必要があります。