Подтвердить что ты не робот

Могу ли я отключить предупреждение об отсутствии "исчерпывающих шаблонов" только для лямбда?

Можно ли отключить не исчерпывающий шаблон, соответствующий предупреждению только для лямбда?

Мне нравится предупреждение вообще, но не для настоящих лямбда-литералов вроде этого:

map (\(x:xs)->...) ls

Я думаю, что этот код делает довольно ясным, что я ожидаю, что все значения ls всегда будут иметь хотя бы один элемент, и нет четкого способа обработать случай ошибки в лямбда. (Думаю, я мог бы переместить совпадение шаблона в оператор case, но это было бы просто уродливо.)

4b9b3361

Ответ 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, поскольку обычно рекомендуется продолжать получать предупреждения такого рода.