Могу ли я отключить предупреждение об отсутствии "исчерпывающих шаблонов" только для лямбда?
Можно ли отключить не исчерпывающий шаблон, соответствующий предупреждению только для лямбда?
Мне нравится предупреждение вообще, но не для настоящих лямбда-литералов вроде этого:
map (\(x:xs)->...) ls
Я думаю, что этот код делает довольно ясным, что я ожидаю, что все значения ls
всегда будут иметь хотя бы один элемент, и нет четкого способа обработать случай ошибки в лямбда. (Думаю, я мог бы переместить совпадение шаблона в оператор case
, но это было бы просто уродливо.)
Ответы
Ответ 1
Да, но только в GHC 7.2; перейдите -fno-warn-incomplete-uni-patterns
(например, в поле Cabal file ghc-options
или в прагме {-# OPTIONS_GHC #-}
в верхней части файла).
Однако это также отключит предупреждение о привязке шаблонов, поэтому let Just x = Nothing in x
не выдаст предупреждение. case
не затрагиваются.
Ответ 2
У вас такие ситуации довольно часто? Это запах кода ИМХО. Я бы хотел увидеть некоторые такие лямбды, и я вполне уверен, что мы можем сделать лучшую версию, которая также прекрасно обрабатывает пустые списки. И во всех остальных случаях вы можете использовать оболочку типа NonEmpty
.
Ответ 3
В случае map
вы можете написать это как понимание списка.
[... | (x:xs) <- ls]
Это не даст никаких предупреждений. Хотя, если пустой список появляется, это просто отфильтровывает его, а не бросает исключение, которое может скрывать ошибки. Переход на безопасный маршрут типа как предлагает Ingo, может быть лучшим вариантом, если вы беспокоитесь об этом.
Ответ 4
Я пошел бы за {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
вместо {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
. И я бы рекомендовал использовать per-file-подход вместо того, чтобы вставлять в него файл cabal, поскольку обычно рекомендуется продолжать получать предупреждения такого рода.