Можно ли отключить предупреждение «неисчерпывающие совпадения с образцами» только для лямбд? - PullRequest
13 голосов
/ 05 февраля 2012

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

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

Ответы [ 5 ]

15 голосов
/ 05 февраля 2012

Да, но только в GHC 7.2 и далее; передать -fno-warn-incomplete-uni-patterns (например, в поле ghc-options вашего файла Cabal или в прагму {-# OPTIONS_GHC #-} вверху файла).

Однако это также отключит предупреждение для привязок к шаблону, поэтому let Just x = Nothing in x не выдаст предупреждение. case заявления не затрагиваются.

6 голосов
/ 05 февраля 2012

У вас бывают такие ситуации довольно часто? Это кодовый запах ИМХО. Я хотел бы увидеть некоторые такие лямбды, и я совершенно уверен, что мы можем сделать лучшую версию, которая также прекрасно обрабатывает пустые списки. И во всех других случаях вы можете использовать оболочку типа списка NonEmpty.

4 голосов
/ 05 февраля 2012

В случае map, вы можете написать это как понимание списка.

[... | (x:xs) <- ls]

Это не будет выдавать никаких предупреждений. Хотя, если появляется пустой список , это просто отфильтрует его, а не вызовет исключение, которое может скрыть ошибки. Если вы беспокоитесь об этом, то лучше всего выбрать безопасный маршрут типа , как предполагает Инго .

3 голосов
/ 20 января 2015

Я бы пошел на {-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} вместо {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}. И я бы порекомендовал использовать индивидуальный подход вместо того, чтобы помещать его в ваш файл для клики, так как обычно рекомендуется продолжать получать предупреждения такого рода.

0 голосов
/ 16 февраля 2019

Вы могли бы написать

{-# LANGUAGE LambdaCase #-}
map (\case (x:xs)->...; [] -> error "wut") ls

В «wut» вы могли бы описать, почему этого не должно было произойти.

...