GHC не проверяет полноту с учетом определения pitched
.Следовательно, первое уравнение по существу игнорируется средством проверки, в результате чего возникает предупреждение.
Действительно, с точки зрения вычислительной техники, GHC не может решить это в общем случае, так как исчерпывающий при наличии зренияшаблоны неразрешимы.В лучшем случае GHC может использовать некоторый сложный статический анализ, но вместо этого он просто предпочитает полностью игнорировать pitched
.
Чтобы отключить предупреждение, я вижу два основных варианта.Во-первых, в конце необходимо добавить регистр «поймать все».
highestPitch :: Instrument -> Either String Float
highestPitch i@(pitched -> False) =
Left $ "Instrument " ++ show i ++ " has no pitch."
highestPitch (Drums (Just Cowbell)) = Right 800
highestPitch Violin = Right 5000
highestPitch Oboe = Right 2000
highestPitch i =
Left $ "Instrument " ++ show i ++ " has no pitch."
-- we could even use "error", in certain cases
Если мы пойдем по этому маршруту, в данном конкретном случае мы можем удалить первое уравнение.
highestPitch :: Instrument -> Either String Float
highestPitch (Drums (Just Cowbell)) = Right 800
highestPitch Violin = Right 5000
highestPitch Oboe = Right 2000
highestPitch i =
Left $ "Instrument " ++ show i ++ " has no pitch."
В качестве альтернативы,мы могли бы сделать последний случай Oboe
всеобъемлющим:
highestPitch :: Instrument -> Either String Float
highestPitch i@(pitched -> False) =
Left $ "Instrument " ++ show i ++ " has no pitch."
highestPitch (Drums (Just Cowbell)) = Right 800
highestPitch Violin = Right 5000
highestPitch _oboe = Right 2000 -- must be an Oboe
Я не большой поклонник этого подхода, хотя, так как, если pitched
содержит ошибку, это будет тихо производить тонакоторого не должно было быть.
На самом деле, как указано выше в комментариях, существует третий способ: использование PatternSynonyms
и COMPLETE
прагмы, чтобы убедить GHC замолчать предупреждение.Это, однако, более продвинутый.Хотя он определенно находит применение в разработке библиотек, для этого конкретного случая это, вероятно, немного излишне.