Вы можете использовать -Werror
, чтобы превратить предупреждения в ошибки. Я не знаю, сможете ли вы превратить только предупреждения о неполных шаблонах в ошибки, извините!
Что касается третьей части вашего вопроса:
Я иногда пишу ряд функций, которые, как правило, тесно работают вместе и имеют свойства, которые вы не можете легко выразить в 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)
равен as
(всякий раз, когда тип элемента находится в Eq
), но в целом duplicate (removeDuplicates bs)
падает, потому что существует нечетное количество элементов или 2 последовательные элементы отличаются. Если он не падает, это потому, что bs
был создан (или мог быть создан) duplicate
в первую очередь !.
Итак, у нас есть следующие законы (не действует в Haskell):
removeDuplicates . duplicate == id
duplicate . removeDuplicates == id (for values in the range of duplicate)
Теперь, если вы хотите предотвратить использование здесь неисчерпывающих шаблонов, вы можете removeDuplicates
вернуть Maybe [a]
или добавить сообщения об ошибках для пропущенных случаев. Вы могли бы даже сделать что-то вроде
newtype DuplicatedList a = DuplicatedList [a]
duplicate :: [a] -> DuplicatedList a
removeDuplicates :: Eq a => DuplicatedList a -> [a]
-- implementations omitted
Все это необходимо, потому что вы не можете легко выразить 'быть списком четной длины с равными последовательными парами элементов' в системе типов Haskell (если вы не Олег:)
Но если вы не экспортируете removeDuplicates
Я думаю, что вполне нормально использовать здесь неисчерпывающие шаблоны. Как только вы его экспортируете, вы потеряете контроль над входными данными и вам придется разобраться с пропущенными делами!