Spec-Zone.ru › Haskell 9

5.2. Предупреждения и проверка на корректность

В GHC есть ряд опций, которые выбирают типы сообщений об ошибках, не являющихся фатальными, иначе известные как предупреждения, которые могут быть сгенерированы во время компиляции. Некоторые опции контролируют отдельные предупреждения, а другие — группы предупреждений. Используйте -W⟨wflag⟩ для включения отдельного предупреждения или группы, или -Wno-⟨wflag⟩ для его отключения. Используйте -Werror для преобразования всех предупреждений в фатальные ошибки, или -Werror=⟨wflag⟩ для преобразования конкретного предупреждения в ошибку. Обратный эффект достигается с помощью -Wwarn для преобразования всех предупреждений в не-фатальные, или -Wwarn=⟨wflag⟩ для преобразования конкретного предупреждения в не-фатальное.

Примечание

В GHC < 8 синтаксис для -W⟨wflag⟩ был -fwarn-⟨wflag⟩ (например, -fwarn-incomplete-patterns). Эта запись устарела, но всё ещё поддерживается для обратной совместимости. Аналогично, -Wno-⟨wflag⟩ раньше был fno-warn-⟨wflag⟩ (например, -fno-warn-incomplete-patterns).

5.2.1. Группы предупреждений

Следующие флаги — это простые способы выбора стандартных «пакетов» предупреждений. Их можно отменить, используя -Wno-⟨group⟩, что эквивалентно -Wno-... для каждого отдельного предупреждения в группе.

-Wdefault
Since:

8.0

По умолчанию вы получаете стандартный набор предупреждений, которые, как правило, указывают на ошибки в вашей программе. Это:

  • -Woverlapping-patterns
  • -Wwarnings-deprecations
  • -Wdeprecations
  • -Wdeprecated-flags
  • -Wunrecognised-pragmas
  • -Wduplicate-exports
  • -Wderiving-defaults
  • -Woverflowed-literals
  • -Wempty-enumerations
  • -Wmissing-fields
  • -Wmissing-methods
  • -Wwrong-do-bind
  • -Wsimplifiable-class-constraints
  • -Wtyped-holes
  • -Wdeferred-type-errors
  • -Wpartial-type-signatures
  • -Wunsupported-calling-conventions
  • -Wdodgy-foreign-imports
  • -Winline-rule-shadowing
  • -Wunsupported-llvm-version
  • -Wmissed-extra-shared-lib
  • -Wtabs
  • -Wunrecognised-warning-flags
  • -Winaccessible-code
  • -Wstar-binder
  • -Wstar-is-type
  • -Woperator-whitespace-ext-conflict
  • -Wambiguous-fields
  • -Wunicode-bidirectional-format-characters
  • -Wgadt-mono-local-binds
  • -Wtype-equality-requires-operators
  • -Wtype-equality-out-of-scope
  • -Wbadly-staged-types
  • -Winconsistent-flags
  • -Wnoncanonical-monoid-instances
  • -Wnoncanonical-monad-instances
  • -Wdata-kinds-tc
-W

Предоставляет стандартные предупреждения плюс

  • -Wunused-binds
  • -Wunused-matches
  • -Wunused-foralls
  • -Wunused-imports
  • -Wincomplete-patterns
  • -Wdodgy-exports
  • -Wdodgy-imports
  • -Wunbanged-strict-patterns
-Wextra

Псевдоним для -W

-Wall

Включает все параметры предупреждений, которые указывают на потенциально подозрительный код. Они включают все предупреждения в -Wextra, плюс:

  • -Whi-shadowing
  • -Wincomplete-record-updates
  • -Wincomplete-record-selectors
  • -Wincomplete-uni-patterns
  • -Wmissing-pattern-synonym-signatures
  • -Wmissing-signatures
  • -Wname-shadowing
  • -Worphans
  • -Wredundant-record-wildcards
  • -Wstar-is-type
  • -Wtrustworthy-safe
  • -Wtype-defaults
  • -Wunused-do-bind
  • -Wunused-record-wildcards
  • -Wincomplete-export-warnings
  • -Wderiving-typeable
-Weverything
Since:

8.0

Включает каждое предупреждение, поддерживаемое компилятором.

-Wcompat
Since:

8.0

Включает предупреждения, которые будут включены по умолчанию в будущем, но пока остаются выключенными в обычных компиляциях. Это позволяет авторам библиотек, стремящимся сделать свой код совместимым с будущими версиями, адаптироваться к новым функциям, прежде чем они начнут генерировать предупреждения.

В настоящее время это включает

  • -Wimplicit-rhs-quantification
  • -Wdeprecated-type-abstractions
-w

Отключает все предупреждения, включая стандартные и те, которые -Wall не включает.

-Wnot

Устаревший псевдоним для -w

При выводе предупреждения отображается конкретный флаг предупреждения, который его контролирует, но необязательно также группа предупреждений:

-fshow-warning-groups
Default:

выключено

При отображении флага, который управляет предупреждением, также отображаются соответствующие флаги группы предупреждений, к которой относится это предупреждение.

5.2.2. Обработка предупреждений как фатальных ошибок

Эти параметры управляют тем, какие предупреждения считаются фатальными и приводят к прерыванию компиляции.

-Werror
Since:

6.8 (-Wwarn)

Превращает любое предупреждение в фатальную ошибку. Полезно, чтобы не пропустить предупреждения при пакетной компиляции. Для отмены -Werror и прекращения обработки любых предупреждений как ошибок используйте -Wwarn, или используйте -Wwarn=⟨wflag⟩ для отмены обработки конкретных предупреждений как ошибок.

-Werror=⟨wflag⟩
Implies:

-W⟨wflag⟩

Превращает конкретное предупреждение в фатальную ошибку. Предупреждение будет включено, если оно ещё не было включено. Можно отменить с помощью -Wwarn=⟨wflag⟩.

-Werror=⟨group⟩ имеет тот же эффект, что и -Werror=... для каждого флага предупреждения в группе (например, -Werror=compat превратит каждое предупреждение в группе -Wcompat в фатальную ошибку).

-Wwarn

Предупреждения обрабатываются только как предупреждения, а не как ошибки. Это значение по умолчанию, но может быть полезно для отмены флага -Werror.

-Wwarn=⟨wflag⟩

Приводит к тому, что определённое предупреждение обрабатывается как обычное предупреждение, а не как фатальная ошибка.

Обратите внимание, что это не полностью отменяет эффекты -Werror=⟨wflag⟩ — предупреждение по-прежнему будет включено.

-Wwarn=⟨group⟩ имеет тот же эффект, что и -Wwarn=... для каждого флага предупреждения в группе (например, -Wwarn=compat сделает каждое предупреждение в группе -Wcompat не фатальным).

-Wno-error=⟨wflag⟩

Альтернативное написание для -Wwarn=⟨wflag⟩.

5.2.3. Варианты отдельных предупреждений

Полный набор вариантов предупреждений описан ниже. Чтобы отключить любое предупреждение, просто укажите соответствующий -Wno-... параметр в командной строке. Для обеспечения обратной совместимости с версиями GHC до 8.0 все эти предупреждения по-прежнему можно контролировать с помощью -f(no-)warn-* вместо -W(no-)*.

-Wunrecognised-warning-flags
Since:

8.0

По умолчанию:

включено

Включает предупреждения, когда компилятор сталкивается с -W... параметром, который не распознается.

-Wcompat-unqualified-imports
Since:

8.10

Это предупреждение устарело. Оно больше не имеет никакого эффекта начиная с GHC 9.12.

-Wprepositive-qualified-module
Since:

8.10

Обычно импорты квалифицируются препозитивно: import qualified M. Используя ImportQualifiedPost, ключевое слово qualified можно использовать после имени модуля. Например: import M qualified. Это предупреждение выводится при использовании первого, препозитивного синтаксиса.

-Wtyped-holes
Since:

7.8

По умолчанию:

включено

Определяет, будут ли компилятор сообщать предупреждения о типовых дырах. Не оказывает влияния, если ошибки типов откладываются до выполнения. См. Типовые дыры и Отложенные ошибки типов до выполнения.

-Wdeferred-type-errors
Since:

8.0

По умолчанию:

включено

Вызывает предупреждение, когда ошибка типа откладывается до выполнения. См. Отложенные ошибки типов до выполнения.

-Wdeferred-out-of-scope-variables
Since:

8.0

Выводит предупреждение при обнаружении отложенной переменной, находящейся вне области видимости. См. Отложенные ошибки типов до выполнения.

-Wpartial-type-signatures
Since:

7.10

По умолчанию:

включено

Определяет, будут ли компилятор сообщать предупреждения о дырах в неполных сигнатурах типов. Не оказывает влияния, если не активирована PartialTypeSignatures, которая определяет, следует ли генерировать ошибки для дыр в типах. См. Неполные сигнатуры типов.

-fhelpful-errors
Since:

7.4

По умолчанию:

включено

Если имя или пакет не найдены в области видимости, будут предложены возможные альтернативы имени или пакету.

-Wunrecognised-pragmas
Since:

6.10

По умолчанию:

включено

Вызывает предупреждение при использовании нераспознанного прагмы. Помимо прагм, используемых самим GHC, GHC также распознает прагмы, известные для использования другими инструментами, например OPTIONS_HUGS и DERIVE.

-Wmisplaced-pragmas
Since:

9.4

По умолчанию:

включено

Выводит предупреждение, если прагма, которая должна появляться только в заголовке модуля, например LANGUAGE или OPTIONS_GHC прагма, появляется вместо этого в теле модуля.

-Wmissed-specialisations
Since:

8.0

По умолчанию:

выключено

Выдает предупреждение, если GHC не может специализировать перегруженную функцию, обычно потому, что функция требует прагмы INLINABLE. Сообщает, когда возникает такая ситуация во время специализации импортированной функции.

Этот вариант предназначен для обнаружения случаев, когда импортированная функция, помеченная как INLINABLE (предположительно для включения специализации), не может быть специализирована, так как она вызывает другие функции, которые сами не специализированы.

Обратите внимание, что это предупреждение не вызовет ошибок, если используется с -Werror.

-Wmissed-specializations

Псевдоним для -Wmissed-specialisations

-Wall-missed-specialisations
Since:

8.0

По умолчанию:

выключено

Выдает предупреждение, если GHC не может специализировать перегруженную функцию, обычно потому, что функция требует прагмы INLINABLE. Сообщает обо всех таких ситуациях.

Обратите внимание, что это предупреждение не вызовет ошибок, если используется с -Werror.

-Wall-missed-specializations

Псевдоним для -Wall-missed-specialisations

-Wextended-warnings
Since:

9.8.1

По умолчанию:

включено

Вызывает предупреждение при использовании модуля, функции или типа с WARNING или DEPRECATED прагмой, независимо от категории, которая может быть связана с прагмой. См. ПРЕДУПРЕЖДЕНИЕ и УСТАРЕВШИЕ прагмы для получения более подробной информации о прагмах. Это подразумевает -Wdeprecations и все -Wx-⟨category⟩ флаги.

-Wx-⟨category⟩
Since:

9.8.1

По умолчанию:

включено

Вызывает предупреждение при использовании модуля, функции или типа с WARNING in "x-⟨category⟩" прагмой. См. ПРЕДУПРЕЖДЕНИЕ и УСТАРЕВШИЕ прагмы для получения более подробной информации о прагмах.

-Wdeprecations
По умолчанию:

включено

Вызывает предупреждение при использовании модуля, функции или типа с DEPRECATED pragma, или WARNING прагмой с deprecated категорией. См. ПРЕДУПРЕЖДЕНИЕ и УСТАРЕВШИЕ прагмы для получения более подробной информации о прагмах.

-Wwarnings-deprecations
Since:

6.10

Default:

on

Выводит предупреждение, когда используется модуль, функция или тип с DEPRECATED pragma, или псевдоним WARNING с категорией deprecated. Подробнее о псевдонимах см. в псевдонимах WARNING и DEPRECATED. Псевдоним для -Wdeprecations.

-Wnoncanonical-monad-instances
Since:

8.0

Default:

on

Выдает предупреждение о неканонических объявлениях экземпляров Applicative или Monad.

При включенном предупреждении проверяются следующие условия:

В объявлениях экземпляров Monad предупреждение выводится, если не выполняются следующие условия:

  • Если return определено, оно должно быть каноническим (т.е. return = pure).
  • Если (>>) определено, оно должно быть каноническим (т.е. (>>) = (*>)).

Кроме того, в объявлениях экземпляров Applicative:

  • Выдается предупреждение, если pure определено в обратном порядке (т.е. pure = return).
  • Выдается предупреждение, если (*>) определено в обратном порядке (т.е. (*>) = (>>)).
-Wnoncanonical-monadfail-instances
Since:

8.0

Это предупреждение устарело. Оно больше не имеет эффекта начиная с GHC 8.8. Оно использовалось в переходный период предложения MonadFail для определения, когда экземпляр класса Monad не был определен с помощью MonadFail, или когда экземпляр MonadFail был определен в обратном порядке, используя метод в Monad.

-Wnoncanonical-monoid-instances
Since:

8.0

Default:

on

Выдает предупреждение о неканонических объявлениях экземпляров Semigroup или Monoid.

При включенном предупреждении проверяются следующие условия:

В объявлениях экземпляров Monoid предупреждение выводится, если не выполняется следующее условие:

  • Если mappend определено, оно должно быть каноническим (т.е. mappend = (Data.Semigroup.<>)).

Кроме того, в объявлениях экземпляров Semigroup:

  • Выдается предупреждение, если (<>) определено в обратном порядке (т.е. (<>) = mappend).
-Wmissing-monadfail-instances
Since:

8.0

Это предупреждение устарело. Оно больше не имеет эффекта начиная с GHC 8.8. Оно использовалось в переходный период предложения MonadFail для предупреждения, когда в блоке do используется неудачный шаблон, у которого нет экземпляра MonadFail.

-Wsemigroup
Since:

8.0

Это предупреждение устарело. Оно больше не имеет эффекта начиная с GHC 9.8. Оно использовалось в переходный период предложения semigroup для предупреждения, когда экземпляр Monoid не был экземпляром Semigroup, или когда пользовательский локальный оператор (<>) мог конфликтовать с (<>), теперь экспортированный из Prelude.

-Wdeprecated-flags
Since:

6.10

Default:

on

Выводит предупреждение, если используется устаревшая командная строка.

-Wunsupported-calling-conventions
Since:

7.6

Выводит предупреждение для внешних объявлений, которые используют неподдерживаемые соглашения об вызове. В частности, если используется соглашение об вызове stdcall, оно будет обработано как ccall.

-Wdodgy-foreign-imports
Since:

6.10

Выводит предупреждение для внешних импортов следующего вида:

foreign import "f" f :: FunPtr t

поскольку, вероятно, следует использовать

foreign import "&f" f :: FunPtr t

Первый вариант объявляет f как чистую C-функцию, принимающую без аргументов и возвращающую указатель на C-функцию типа t, тогда как второй вариант объявляет f как C-функцию с типом t. Первый вариант обычно является ошибкой, которую сложно отладить, так как он приводит к ошибке, поэтому это предупреждение.

-Wdodgy-exports
Since:

6.12

Выводит предупреждение, когда тип данных T экспортируется со всеми конструкторами, т.е. T(..), но он является просто синонимом типа.

Также выводит предупреждение, когда модуль повторно экспортируется, но этот модуль ничего не экспортирует.

-Wdodgy-imports
Since:

6.8

Выводит предупреждение в следующих случаях:

  • Когда тип данных T импортируется со всеми конструкторами, т.е. T(..), но был экспортирован абстрактно, т.е. T.
  • Когда оператор import скрывает сущность, которая не экспортирована.
-Woverflowed-literals
Since:

7.8

Выводит предупреждение, если литерал переполнится, например, 300 :: Word8.

-Wempty-enumerations
Since:

7.8

Выводит предупреждение, если перечисление пустое, например, [5 .. 3].

-Wderiving-defaults
Since:

8.10

Выводит предупреждение, когда оба DeriveAnyClass и GeneralizedNewtypeDeriving включены, и не используется явная стратегия вывода. Например, это приведет к предупреждению:

class C a
newtype T a = MkT a deriving C
-Wduplicate-constraints
Since:

7.8

Приводит к тому, что компилятор предупреждает о дублирующих ограничениях в сигнатуре типа. Например

f :: (Eq a, Show a, Eq a) => a -> a

Предупреждение укажет на дублирующее ограничение Eq a.

Этот параметр теперь устарел в пользу -Wredundant-constraints.

-Wredundant-constraints
Since:

8.0

Компилятор будет выдавать предупреждение о лишних ограничениях в сигнатуре типа. В частности:

  • Лишнее ограничение в самой сигнатуре типа:

    f :: (Eq a, Ord a) => a -> a
    

    Предупреждение укажет на избыточное Eq a ограничение: оно подразумевается Ord a ограничением.

  • Ограничение в сигнатуре типа не используется в коде, который оно охватывает:

    f :: Eq a => a -> a -> Bool
    f x y = True
    

    Предупреждение укажет на лишнее Eq a ограничение: оно не используется определением f.

Аналогичные предупреждения выдаются для избыточного ограничения в объявлении экземпляра.

При включении, вы можете подавить его на уровне модуля с помощью -Wno-redundant-constraints. Иногда вам может потребоваться, чтобы функция имела более ограниченную сигнатуру, чем необходимо, возможно, чтобы оставить себе свободу изменения реализации без изменения API. В этом случае вы можете подавить предупреждение для каждой функции, используя вызов в мёртвой связи. Например:

f :: Eq a => a -> a -> Bool
f x y = True
where
    _ = x == x  -- Suppress the redundant-constraint warning for (Eq a)

Здесь вызов (==) заставляет GHC думать, что (Eq a) ограничение необходимо, поэтому предупреждение не выдаётся.

-Wduplicate-exports
Since:

at least 5.04

Default:

on

Компилятор предупреждает о дублирующихся записях в списках экспорта. Это полезна информация, если вы поддерживаете большие списки экспорта и хотите избежать дальнейшего экспорта определения после того, как вы удалили (одну) ссылку на него в списке экспорта.

-Whi-shadowing
Since:

at least 5.04, deprecated

Вызывает компилятор к выводу предупреждения, когда модуль или файл интерфейса в текущей директории затеняет такой же модуль с тем же именем в библиотеке или другой директории.

Этот флаг был реализован некорректно и теперь устарел. Он будет удалён в будущей версии GHC.

-Widentities
Since:

7.2

Вызывает компилятор выдать предупреждение, когда преобразование числового типа Prelude преобразует тип T в тот же тип T; такие вызовы, вероятно, являются операциями "без действия" и могут быть опущены. Функции, проверенные на это: toInteger, toRational, fromIntegral, и realToFrac.

-Wimplicit-kind-vars
Since:

8.6

Это предупреждение устарело. Оно больше не имеет эффекта с GHC 8.10. Оно использовалось для определения, если переменная типа не явно квантифицируется. Например, следующее вызовет предупреждение:

f :: forall (a :: k). Proxy a

Теперь это ошибка и может быть исправлена явной квантификацией k:

f :: forall k (a :: k). Proxy a

или

f :: forall {k} (a :: k). Proxy a
-Wimplicit-lift
Since:

9.2

Цитаты Template Haskell, которые ссылаются на локальные переменные, связанные вне цитаты, неявно преобразуются для использования lift. Например, f x = [| reverse x |] становится f x = [| reverse $(lift x) |]). Этот флаг выводит предупреждение для каждого такого неявного добавления lift. Это может быть полезно при отладке более сложных стадийных программ, где неявное lift может случайно скрыть переменную, используемую на неправильной стадии.

-Wimplicit-prelude
Since:

6.8

Default:

off

Вызывает компилятор предупредить, если Prelude импортируется неявно. Это происходит, если модуль Prelude не импортируется явно с помощью строки import ... Prelude ..., или этот неявный импорт отключён (либо с помощью NoImplicitPrelude, либо с помощью LANGUAGE NoImplicitPrelude pragmy).

Обратите внимание, что предупреждение не выдаётся для синтаксиса, который неявно ссылается на Prelude, даже если NoImplicitPrelude изменит ссылку на Prelude. Например, предупреждение не выдаётся, когда 368 означает Prelude.fromInteger (368::Prelude.Integer) (где Prelude относится к фактическому модулю Prelude, независимо от импорта модуля, который компилируется).

-Wincomplete-patterns
Since:

5.04

Опция -Wincomplete-patterns предупреждает о местах, где соответствие шаблону может завершиться ошибкой во время выполнения. Функция g ниже завершится ошибкой при применении к непустым спискам, поэтому компилятор выведет предупреждение об этом, когда включена -Wincomplete-patterns.

g [] = 2

Эта опция по умолчанию не включена, потому что может быть немного шумной, и она не всегда указывает на ошибку в программе. Однако в целом считается хорошей практикой охватывать все случаи в ваших функциях, и она включается с -W.

-Wincomplete-uni-patterns
Since:

7.2

Флаг -Wincomplete-uni-patterns похож на -Wincomplete-patterns, за исключением того, что он применяется только к выражениям лямбда-функций и связываниям шаблонов, конструкциям, которые допускают только один шаблон:

h = \[] -> 2
Just k = f y

Кроме того, этот флаг также применяется к ленивым шаблонам, так как они являются синтаксическим сахаром для связываний шаблонов. Например, f ~(Just x) = (x,x) эквивалентно f y = let Just x = y in (x,x).

-fmax-pmcheck-models=⟨n⟩
Since:

8.10

Default:

30

Проверка соответствия шаблонам работает, присваивая символические значения каждому шаблону. Мы называем каждое такое присваивание ‘модель’. Теперь каждый узел соответствия шаблонам может потенциально привести к нескольким разбиениям этой модели, кодирующим различные способы, которыми соответствие шаблону может завершиться ошибкой. Например, при соответствии x со Just 4, мы разбиваем каждый входящую модель соответствия на две нераскрытые подмодели: одну, где x равно Nothing, и одну, где x равно Just y, но y не равно 4.

Это может быть экспоненциальным по арифметической части шаблона и количеству условных операторов в некоторых случаях. Ограничение -fmax-pmcheck-models=⟨n⟩ гарантирует, что мы имеем полиномиальную сложность по числу шаблонов, забывая детализированную информацию, полученную от частично успешного соответствия. Для вышеприведённого примера, если у нас было ограничение в 1, мы бы продолжили проверку следующего узла с оригинальной, не детализированной моделью.

-Wincomplete-record-updates
Since:

6.4

Функция f ниже завершится ошибкой, когда применяется к Bar, поэтому компилятор выведет предупреждение об этом, когда включена -Wincomplete-record-updates.

data Foo = Foo { x :: Int }
         | Bar

f :: Foo -> Foo
f foo = foo { x = 6 }

Эта опция по умолчанию не включена, потому что может быть очень шумной, и она часто не указывает на ошибку в программе.

-Wincomplete-record-selectors
Since:

9.10

Когда селектор записи применяется к конструктору, который не содержит этого поля, он вызовет ошибку. Например

data T = T1 | T2 { x :: Int }

f :: T -> Int
f a = x a -- `f T1` will fail

g1 :: HasField "x" t Int => t -> Int
g1 a = 1 + getField @"x" a

g2 :: T -> Int
g2 a = g1 a + 2 -- `g2 T1` will fail as well

Предупреждение предупреждает о подобных случаях. Оно также учитывает ранее обработанные случаи соответствия шаблонам, например

d :: T -> Int
d T1 = 0
d a = x a -- would not warn
-Wmissing-deriving-strategies
Since:

8.8.1

Default:

выкл.

Тип данных ниже использует тип Eq typeclass, но не указывает стратегию. При включённом -Wmissing-deriving-strategies компилятор выведет предупреждение об этом.

data Foo a = Foo a
  deriving (Eq)

Компилятор выдаст предупреждение о том, что в инструкции `deriving` не указана стратегия. Предлагаемое исправление покажет, какие стратегии `deriving` были предположены.

Если предупреждение включено, но DerivingStrategies не включено, компилятор предложит включить расширение DerivingStrategies.

-Wmissing-fields
Since:

по крайней мере 5.04

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

-Wmissing-export-lists
Since:

8.4

Этот флаг предупреждает, если вы объявляете модуль без явного списка экспорта. Например

module M where

  p x = x

Флаг -Wmissing-export-lists предупредит, что M не объявляет список экспорта. Объявление явного списка экспорта для M включает в GHC анализ «мертвого кода», предотвращает случайный экспорт имён и может облегчить оптимизации, такие как встраивание.

-Wmissing-import-lists
Since:

7.0

Этот флаг предупреждает, если вы используете объявление import без указания сущностей, добавленных в область видимости. Например

module M where
  import X( f )
  import Y
  import qualified Z
  p x = f x x

Флаг -Wmissing-import-lists предупредит об импорте Y, но не X. Если модуль Y позже будет изменён для экспорта (например) f, ссылка на f в M станет неоднозначной. Предупреждение не выдаётся для импорта Z, потому что расширение экспорта Z вряд ли приведёт к неоднозначности в M.

-Wmissing-methods
Since:

по крайней мере 5.04

Default:

вкл.

Этот параметр предупреждает вас всякий раз, когда в объявлении экземпляра отсутствует один или несколько методов, а соответствующее объявление класса не имеет для них объявления по умолчанию.

Макрос MINIMAL может быть использован для изменения комбинации методов, которые будут необходимы для экземпляров определённого класса. См. MINIMAL pragma.

-Wmissing-signatures
Since:

по крайней мере 5.04

Default:

выкл.

Если вы хотите, чтобы GHC проверял, имеет ли каждая функция/значение верхнего уровня сигнатуру типа, используйте параметр -Wmissing-signatures. В качестве части предупреждения GHC также сообщает выведенный тип.

-Wmissing-exported-sigs
Since:

7.10

Этот параметр теперь устарел и заменён на -Wmissing-exported-signatures.

-Wmissing-exported-signatures
Since:

8.0

Default:

выкл.

Если вы хотите, чтобы GHC проверял, имеет ли каждая экспортируемая функция/значение верхнего уровня сигнатуру типа, но не проверял неэкспортируемые значения, используйте параметр -Wmissing-exported-signatures. Если этот параметр используется совместно с -Wmissing-signatures, каждая функция/значение верхнего уровня должна иметь сигнатуру типа. В качестве части предупреждения GHC также сообщает выведенный тип.

-Wmissing-local-sigs
Since:

7.0

Этот параметр теперь устарел и заменён на -Wmissing-local-signatures.

-Wmissing-local-signatures
Since:

8.0

Если вы используете флаг -Wmissing-local-signatures, GHC предупредит вас о любых полиморфных локальных связях. В качестве части предупреждения GHC также сообщает выведенный тип. Параметр по умолчанию выключен.

-Wmissing-pattern-synonym-signatures
Since:

8.0

Default:

выкл.

Если вы хотите, чтобы GHC проверял, имеет ли каждый синоним шаблонов сигнатуру типа, используйте параметр -Wmissing-pattern-synonym-signatures. Если этот параметр используется совместно с -Wmissing-exported-signatures, то только экспортируемые синонимы шаблонов должны иметь сигнатуру типа. GHC также сообщает выведенный тип.

-Wmissing-kind-signatures
Since:

9.2

Default:

выкл.

Если вы хотите, чтобы GHC проверял, имеет ли каждая декларация данных, семейство типов, определение типа класса сигнатуру вида standalone kind signature или CUSK, используйте параметр -Wmissing-kind-signatures. Вы можете указать вид с помощью StandaloneKindSignatures или CUSKs.

Обратите внимание, что -Wmissing-kind-signatures не предупреждает об ассоциированных семействах типов, так как GHC считает, что у ассоциированного семейства типов есть CUSK, если у его содержащего класса есть CUSK. (См. Полные пользовательские сигнатуры вида и полиморфная рекурсия для получения дополнительной информации по этому пункту). Поэтому, указание родительскому классу отдельной сигнатуры вида или CUSK достаточно для исправления предупреждения для ассоциированных семейств типов класса.

-Wmissing-poly-kind-signatures
Since:

9.8

Default:

выкл.

Это ограниченная версия -Wmissing-kind-signatures.

Он предупреждает, когда декларация определяет конструктор типа, у которого отсутствует standalone kind signature и чья выведенная сигнатура вида полиморфна (что происходит с -PolyKinds. Например

data T a = MkT (a -> Int)    -- T :: Type -> Type
                             -- Not polymorphic, hence no warning
data W f a = MkW (f a)       -- W :: forall k. (k->Type) -> k -> Type
                             -- Polymorphic, hence warning!

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

-Wmissing-exported-pattern-synonym-signatures
По умолчанию:

выключено

Если вы хотите, чтобы GHC проверял, что каждый экспортированный синоним шаблона имеет подпись типа, но не проверял неэкспортированные синонимы шаблонов, используйте параметр -Wmissing-exported-pattern-synonym-signatures. Если этот параметр используется совместно с -Wmissing-pattern-synonym-signatures, то каждый синоним шаблона должен иметь подпись типа. В рамках предупреждения GHC также сообщает выведенный тип.

-Wname-shadowing
С версии:

по крайней мере 5.04

Этот параметр вызывает выведение предупреждения всякий раз, когда значение из внутреннего пространства имён имеет то же имя, что и значение из внешнего пространства имён, то есть внутреннее значение затеняет внешнее. Это позволяет ловить опечатки, которые могут привести к трудноустранимым ошибкам, например, в нежелательном захвате, который бы в f = ... let f = id in ... f ... стал рекурсивным вызовом.

Предупреждение подавляется для имён, начинающихся с нижнего подчёркивания. Например

f x = do { _ignore <- this; _ignore <- that; return (the other) }
-Worphans
С версии:

6.4

Эти параметры вызывают выведение предупреждения всякий раз, когда модуль содержит объявление «сиротского» экземпляра или правило переписывания. Объявление экземпляра является сиротой, если оно появляется в модуле, в котором ни класс, ни тип, для которых происходит экземплирование, не объявлены в том же модуле. Правило является сиротой, если это правило для функции, объявленной в другом модуле. Модуль, содержащий любые сирот, называется сиротским модулем.

Проблема с сиротами заключается в том, что GHC должен предварительно читать файлы интерфейсов всех сиротских модулей, на случай, если их экземпляры или правила играют роль, независимо от того, полезен ли интерфейс модуля в противном случае. См. Сиротские модули и объявления экземпляров для получения подробностей.

Параметр -Worphans предупреждает о пользовательских сиротских правилах или экземплярах.

-Woverlapping-patterns
С версии:

по крайней мере 5.04

По умолчанию компилятор выведет предупреждение, если набор шаблонов перекрывается, например:

f :: String -> Int
f []     = 0
f (_:xs) = 1
f "2"    = 2

где последний шаблон совпадения в f никогда не будет достигнут, так как второй шаблон перекрывает его. Чаще всего избыточные шаблоны являются ошибками программиста, поэтому этот параметр включён по умолчанию.

Если программист твёрдо настроен сохранить избыточный оператор, например, чтобы предотвратить повреждение кода, он может использовать условие, проверяющее GHC.Exts.considerAccessible, чтобы предотвратить метку родительского оператора как избыточного:

g :: String -> Int
g []                       = 0
g (_:xs)                   = 1
g "2" | considerAccessible = 2 -- No warning!

Обратите внимание, что considerAccessible должен стоять в качестве последнего утверждения условия, чтобы не повлиять на результаты анализа. Например, если вы напишете

h :: Bool -> Int
h x = case (x, x) of
  (True,  True)  -> 1
  (False, False) -> 2
  (True,  False) | considerAccessible, False <- x -> 3

Анализатор шаблонов совпадения принимает вас всерьёз, определит, что False <- x может не выполниться, и выведет предупреждение, что совпадение шаблонов неполное. Поместите considerAccessible в конец, чтобы избежать подобных неоднозначностей.

Обратите внимание, что из-за технических ограничений considerAccessible не подавляет предупреждения -Winaccessible-code.

-Winaccessible-code
С версии:

8.6

По умолчанию компилятор выведет предупреждение, если типы сделают ветвь недоступной. Это, как правило, требует GADTs или подобных расширений.

Например, рассмотрим следующую программу

{-# LANGUAGE GADTs #-}

data Foo a where
 Foo1 :: Foo Char
 Foo2 :: Foo Int

data TyEquality a b where
        Refl :: TyEquality a a

checkTEQ :: Foo t -> Foo u -> Maybe (TyEquality t u)
checkTEQ x y = error "unimportant"

step2 :: Bool
step2 = case checkTEQ Foo1 Foo2 of
         Just Refl -> True -- Inaccessible code
         Nothing -> False

Ветвь Just Refl в step2 недоступна, потому что для того, чтобы checkTEQ смогло произвести Just, должно выполняться t ~ u, но так как мы передаём Foo1 и Foo2, следует, что t ~ Char, и u ~ Int, и, следовательно, t ~ u не может выполняться.

-Wstar-is-type
С версии:

8.6

Использование * для обозначения типа населённых типов основано на расширении StarIsType, которое в будущей версии будет отключено по умолчанию, а затем, возможно, удалено. Причины этого и график устаревания описаны в предложении GHC #143.

Это предупреждение позволяет обнаружить такие использования * до фактического изменения, приводящего к разрыву совместимости. Рекомендуемое исправление — заменить * на Type из Data.Kind.

-Wstar-binder
С версии:

8.6

В рамках StarIsType, * в типах не является оператором или даже именем, это специальный синтаксис, представляющий Data.Kind.Type. Это означает, что выражение, например, Either * Char, разбирается как Either (*) Char, а не как (*) Either Char.

В позициях привязки действуют аналогичные правила разбора. Рассмотрим следующий пример

{-# LANGUAGE TypeOperators, TypeFamilies, StarIsType #-}

type family a + b
type family a * b

В то время как a + b разбирается как (+) a b и становится позицией привязки для оператора типа (+), a * b разбирается как a (*) b и отклоняется.

В качестве обходного решения мы разрешаем привязывать (*) в префиксной форме:

type family (*) a b

Это довольно хрупкое соглашение, поскольку, как правило, программист ожидает, что (*) a b эквивалентно a * b. С -Wstar-binder мы предупреждаем, когда происходит это специальное обращение с (*).

-Wsimplifiable-class-constraints
С версии:

8.2

По умолчанию:

включено

Предупреждать о ограничениях класса в подписи типа, которые могут быть упрощены с помощью объявления экземпляра верхнего уровня. Например:

f :: Eq [a] => a -> a

Здесь Eq [a] в подписи перекрывается экземпляром верхнего уровня для Eq [a]. GHC прилагает усилия для использования первого, но если он должен использовать второй, у него будет неразрешимое ограничение Eq a. Лучше этого избежать, написав вместо этого:

f :: Eq a => a -> a
-Wtabs
С версии:

6.8

Вызывать предупреждение компилятора, если в вашем исходном файле есть табуляции.

-Wtype-defaults
С версии:

по крайней мере 5.04

По умолчанию:

выключено

Вызывать предупреждение/информирование компилятора о местах в исходном коде, где механизм Haskell по умолчанию для числовых типов вступает в действие. Эта информация полезна при преобразовании кода из контекста, в котором предполагалось одно значение по умолчанию, в контекст с другим, например, «по умолчанию по умолчанию» для Haskell 1.4 присваивало типу 1 тип Int, в то время как Haskell 98 и более поздние версии по умолчанию присваивают ему тип Integer. Это может привести к различиям в производительности и поведении, поэтому полезно быть не молчаливым в отношении этого.

-Wmonomorphism-restriction
С версии:

6.8

По умолчанию:

выключено

Выводить предупреждение/информирование компилятора о местах в исходном коде, где применяется ограничение мономорфизма Haskell. Если ограничение применяется молча, оно может привести к неожиданному поведению, поэтому полезно иметь явное предупреждение о его применении.

-Wunsupported-llvm-version
С версии:

7.8

Предупреждать, когда используется -fllvm с неподдерживаемой версией LLVM.

-Wmissed-extra-shared-lib
С версии:

8.8

Предупреждать, когда GHCi не может загрузить общую библиотеку, которую он вывел, что должен загрузить при загрузке пакета и анализе раздела extra-libraries описания целевого пакета.

-Wunticked-promoted-constructors
Since:

7.10

Предупреждение, если продвинутый конструктор данных используется без тильды перед его именем.

Например:

data Nat = Succ Nat | Zero

data Vec n s where
  Nil  :: Vec Zero a
  Cons :: a -> Vec n a -> Vec (Succ n) a

Выведет два предупреждения, потому что Zero и Succ не записаны как 'Zero и 'Succ.

Это также относится к литералам списков начиная с 9.4. Например:

type L = [Int, Char, Bool]

выведет предупреждение, потому что [Int, Char, Bool] — это продвинутый список, которому не хватает тильды.

-Wunused-binds
Since:

at least 5.04

Отчет о любых определениях функций (и локальных связях), которые не используются. Псевдоним для

  • -Wunused-top-binds
  • -Wunused-local-binds
  • -Wunused-pattern-binds
-Wunused-top-binds
Since:

8.0

Отчет о любых определениях функций, которые не используются.

Точнее, выводить предупреждение, если связывание вводит в область видимости переменную, которая не используется, если только имя переменной не начинается с подчеркивания. Условие «начинается с подчеркивания» позволяет выборочно отключать предупреждение.

Переменная считается «используемой», если

  • Она экспортирована, или
  • Она появляется в правой части связывания, которое связывает по крайней мере одну используемую переменную.

Например:

module A (f) where
f = let (p,q) = rhs1 in t p  -- No warning: q is unused, but is locally bound
t = rhs3                     -- No warning: f is used, and hence so is t
g = h x                      -- Warning: g unused
h = rhs2                     -- Warning: h is only used in the
                             -- right-hand side of another unused binding
_w = True                    -- No warning: _w starts with an underscore
-Wunused-local-binds
Since:

8.0

Отчет о любых локальных определениях, которые не используются. Например:

module A (f) where
f = let (p,q) = rhs1 in t p  -- Warning: q is unused
g = h x                      -- No warning: g is unused, but is a top-level binding
-Wunused-pattern-binds
Since:

8.0

Предупреждать, если привязку шаблона не связывает ни одной переменной, за исключением одиночного шаблона-звездочки или шаблона с восклицательным знаком. Например:

Just _ = rhs3    -- Warning: unused pattern binding
(_, _) = rhs4    -- Warning: unused pattern binding
_  = rhs3        -- No warning: lone wild-card pattern
!() = rhs4       -- No warning: banged pattern; behaves like seq

В общем случае ленивое связывание шаблона p = e является бесполезным, если p не связывает ни одной переменной. Мотивация разрешения одиночных шаблонов-звездочек в том, что они мало чем отличаются от _v = rhs3, которые не вызывают предупреждения; и они могут быть полезны для добавления ограничения типа, например, _ = x::Int. Шаблон с восклицательным знаком (см. Шаблоны с восклицательным знаком и строго типизированный Haskell) — это *не* бесполезное действие, потому что он форсирует вычисление и полезен как альтернатива seq.

-Wunused-imports
Since:

at least 5.04

Отчет о любых модулях, которые явно импортированы, но никогда не используются. Однако форма import M() никогда не сообщается как неиспользуемый импорт, потому что это полезный прием для импорта объявлений экземпляров, которые анонимны в Haskell.

-Wunused-matches
Since:

at least 5.04

Отчет обо всех неиспользуемых переменных, которые возникают из сопоставлений шаблонов на уровне терминов, включая шаблоны, состоящие из одной переменной. Например, f x y = [] сообщит о x и y как неиспользуемых. Предупреждение подавляется, если имя переменной начинается с подчеркивания, таким образом:

f _x = True

Обратите внимание, что -Wunused-matches не предупреждает о переменных, которые возникают из шаблонов на уровне типов, как в экземплярах типов семейств и данных. Это должно быть включено отдельно с помощью флага -Wunused-type-patterns.

-Wunused-do-bind
Since:

6.12

Отчет о выражениях, встречающихся в do и mdo блоках, которые, по-видимому, молча выбрасывают информацию. Например, do { mapM popInt xs ; return 10 } сообщит о первом операторе в do блоке как о подозрительном, поскольку он имеет тип StackM [Int] и не StackM (), но значение [Int] не привязано ни к чему. Предупреждение подавляется путем явного указания в исходном коде, что ваша программа выбрасывает что-то:

do { _ <- mapM popInt xs ; return 10 }

Конечно, в этой конкретной ситуации вы можете сделать еще лучше:

do { mapM_ popInt xs ; return 10 }
-Wunused-type-patterns
Since:

8.0

Отчет обо всех неиспользуемых неявных связанных переменных типа, которые возникают из шаблонов в экземплярах семейств типов и данных. Например:

type instance F x y = []

сообщит о x и y как неиспользуемых в правой части. Предупреждение подавляется, если имя переменной типа начинается с подчеркивания, как в этом случае:

type instance F _x _y = []

При включенном ExplicitForAll, явно квантифицированные переменные типа также могут быть определены как неиспользуемые. Например:

type instance forall x y. F x y = []

все еще будет сообщать о x и y как неиспользуемых в правой части.

В отличие от -Wunused-matches, -Wunused-type-patterns не подразумевается -Wall. Обоснование этого решения заключается в том, что в отличие от имен шаблонов на уровне терминов, имена типов часто выбираются специально для целей документирования, поэтому использование подчеркиваний в именах типов может затруднить чтение документации.

-Wunused-foralls
Since:

8.0

Отчет обо всех неиспользуемых переменных типа, которые возникают из явных, написанных пользователем forall операторов. Например:

g :: forall a b c. (b -> b)

сообщит о a и c как неиспользуемых.

-Wunused-record-wildcards
Since:

8.10

Отчет обо всех записях-звездочками, где ни одна из неявно связанных переменных не используется. Например:

data P = P { x :: Int, y :: Int }

f1 :: P -> Int
f1 P{..} = 1 + 3

сообщит, что совпадение P{..} не используется.

-Wredundant-bang-patterns
Since:

9.2

Отчет о мертвых шаблонах с восклицательными знаками, где мертвые восклицательные знаки — это шаблоны с восклицательными знаками, которые при любых обстоятельствах не могут форсировать лямбду, которая не была уже форсирована. Мертвые восклицательные знаки являются формой избыточных восклицательных знаков. Новый проверка выполняется в проверочнике охвата сопоставления шаблонов вместе с другими проверками (именно, избыточными и недоступными правыми частями). Учитывая

f :: Bool -> Int
f True = 1
f !x   = 2

Шаблон с восклицательным знаком в !x является мертвым. К моменту, когда x во втором уравнении, x уже будет форсирован из-за первого уравнения (f True = 1). Более того, нет способа достичь второго уравнения, не пройдя через первое.

Обратите внимание, что -Wredundant-bang-patterns не будет предупреждать о мертвых шаблонах с восклицательными знаками, которые появляются в избыточном предложении. Это связано с тем, что в этом случае рекомендуется полностью удалить предложение, включая его ведущее сопоставление шаблона.

Мертвые шаблоны с восклицательными знаками являются избыточными. Но есть шаблоны с восклицательными знаками, которые являются избыточными, но не мертвыми, например:

f !() = 0

восклицательный знак все равно форсирует аргумент, прежде чем мы попытаемся сопоставить (). Но это избыточно с принуждением, выполненным сопоставлением (). В настоящее время такие избыточные восклицательные знаки не считаются мертвыми, и -Wredundant-bang-patterns не будет предупреждать о них.

-Wredundant-record-wildcards
Since:

8.10

Отчет обо всех записях-звездочках, где совпадение звездочки не связывает никаких шаблонов. Например:

data P = P { x :: Int, y :: Int }

f1 :: P -> Int
f1 P{x,y,..} = x + y

сообщит, что совпадение P{x, y, ..} имеет избыточное использование ...

-Wredundant-strictness-flags
Since:

9.4

Отчет о флагах строгости, примененных к неподнятым типам. Неподнятый тип всегда строгий, и применение флага строгости не оказывает никакого влияния.

Например:

data T = T !Int#
-Wwrong-do-bind
Since:

6.12

Сообщает об выражениях, встречающихся в блоках do и mdo, которые, по-видимому, не имеют привязки. Например, do { return (popInt 10) ; return 10 } сообщит о первом операторе в блоке do как подозрительном, так как у него тип StackM (StackM Int) (который состоит из двух вложенных применений одного и того же конструктора монады), но который затем не «распаковывается» путём привязки результата. Предупреждение подавляется путём явного указания в исходном коде, что ваша программа что-то отбрасывает:

do { _ <- return (popInt 10) ; return 10 }

Для почти всех разумных программ это укажет на ошибку, и вы, вероятно, имели в виду написать:

do { popInt 10 ; return 10 }
-Winline-rule-shadowing
Since:

7.8

Выдаёт предупреждение, если правило переписывания RULE может не сработать, потому что функция может быть встроена, прежде чем правило успеет сработать. См. Как правила взаимодействуют с директивами INLINE/NOINLINE.

-Wcpp-undef
Since:

8.2

Этот флаг передаёт -Wundef препроцессору C (если он используется), что заставляет препроцессор предупреждать об использовании директивы #if для неопределённых идентификаторов.

-Wunbanged-strict-patterns
Since:

8.2

Этот флаг предупреждает всякий раз, когда вы записываете шаблон, который привязывает переменную, тип которой не поднят, и тем не менее шаблон не является шаблоном bang или простой переменной. См. Неупакованные типы для получения информации о неподнятых типах.

-Wmissing-home-modules
Since:

8.2

Когда модуль, предоставленный текущим пакетом, который компилируется (то есть «домашний» пакет), импортируется, но не указан явно в командной строке как целевой. Полезно для Cabal, чтобы гарантировать, что GHC не загрузит модули, не перечисленные ни в exposed-modules, ни в other-modules.

-Wpartial-fields
Since:

8.4

Вариант -Wpartial-fields предупреждает о поле записи f, которое определено в некоторых, но не во всех конструкторах типа данных, так как выбор и обновление записи будут частичными. Например, при включённом -Wpartial-fields компилятор выведет предупреждение при определении Foo ниже:

data Foo = Foo { f :: Int } | Bar

Предупреждение подавляется, если имя поля начинается с нижнего подчёркивания.

data Foo = Foo { _f :: Int } | Bar

Связанные предупреждения — -Wincomplete-record-selectors и -Wincomplete-record-updates, которые предупреждают в местах использования, а не в местах определения.

-Wunused-packages
Since:

8.10

Вариант -Wunused-packages предупреждает о пакетах, указанных в командной строке через -package ⟨pkg⟩ или -package-id ⟨unit-id⟩, но которые не потребовались во время компиляции. Если сработает предупреждение, это означает, что указанный пакет не был необходим для компиляции.

Это предупреждение плохо взаимодействует с GHCi, так как большинство вызовов передают большое количество -package аргументов при начальной загрузке. Поэтому, если вы изменяете целевые значения с помощью :load или :cd, предупреждение будет молча отключено, если оно включено (см. #21110).

-Winvalid-haddock
Since:

9.0

При включённом варианте -haddock GHC собирает комментарии к документации и связывает их с объявлениями, аргументами функций, конструкторами данных и другими синтаксическими элементами. Комментарии к документации в недопустимых позициях отбрасываются:

myValue =
  -- | Invalid (discarded) comment in an expression
  2 + 2

Это предупреждение сообщает вам об отброшенных комментариях к документации. Оно не имеет эффекта, когда -haddock выключен.

-Woperator-whitespace-ext-conflict
Since:

9.2

Когда включён TemplateHaskell, f $x анализируется как f применённое к нетипизированному вставлению. Но когда расширение отключено, выражение анализируется как использование инфиксного оператора $.

Чтобы облегчить чтение f $x без проверки включённых расширений, можно переписать его как f $ x, что и предлагает это предупреждение.

В настоящее время он обнаруживает следующие случаи:

  • $x может означать нетипизированное вставление при TemplateHaskell
  • $$x может означать типизированное вставление при TemplateHaskell
  • %m может означать аннотацию кратности при LinearTypes

Он охватывает только существующие расширения. Если вы хотите реализовать более жёсткую политику и всегда требовать пробелы вокруг всех инфиксных операторов, используйте -Woperator-whitespace.

-Woperator-whitespace
Since:

9.2

Существует четыре типа инфиксных операторов, как определено в GHC Proposal #229:

a ! b   -- a loose infix occurrence
a!b     -- a tight infix occurrence
a !b    -- a prefix occurrence
a! b    -- a suffix occurrence

Слабое инфиксное использование любого оператора всегда анализируется как инфиксный оператор, но другим типам использования могут быть присвоены специальные значения. Например, префикс ! обозначает шаблон bang, а префикс $ обозначает вставление TemplateHaskell.

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

-Wauto-orphans
Since:

7.4

Ничего не делает.

-Wmissing-space-after-bang
Since:

8.8

Ничего не делает.

-Wderiving-typeable
Since:

7.10

Это предупреждение возникает, когда Typeable указано в производящей части или производятся с помощью StandaloneDeriving.

Начиная с GHC 7.10, Typeable автоматически производятся для всех типов. Таким образом, производная Typeable вручную избыточна.

-Wambiguous-fields
Since:

9.2

Когда включен DuplicateRecordFields, опция -Wambiguous-fields предупреждает о случаях полей в селекторах или обновлениях, которые зависят от устаревшего механизма семантического разграничения типов. Этот механизм будет удалён в будущей версии GHC, а в этот момент эти случаи будут отклонены как неоднозначные. Смотрите предложение DuplicateRecordFields без неоднозначного доступа к полям и документацию по DuplicateRecordFields для получения дополнительной информации.

Это предупреждение не имеет эффекта, когда DuplicateRecordFields отключен.

-Wforall-identifier
Since:

9.4

Это предупреждение устарело. Оно больше не оказывает никакого влияния с GHC 9.10.

В прошлом GHC принимал forall в качестве идентификатора на уровне терминов:

-- from constraints-0.13
forall :: forall p. (forall a. Dict (p a)) -> Dict (Forall p)
forall d = ...

В соответствии с GHC Proposal #281, это больше невозможно, так как forall стал ключевым словом. -Wforall-identifier использовался в период миграции до внесения критических изменений.

-Wunicode-bidirectional-format-characters
Since:

9.0.2

Явные символы форматирования Unicode для двунаправленного выравнивания могут привести к тому, что исходный код будет искажённо отображаться во многих визуализаторах. Мы предупреждаем, если в источнике присутствует любой такой символ.

В частности, символы, запрещенные этим предупреждением, — это те, которые входят в категорию «Явное форматирование» в списке типов символов Unicode для двунаправленного выравнивания.

-Wgadt-mono-local-binds
Since:

9.4.1

Это предупреждение срабатывает при сопоставлении с образцом, включающим GADTs, если MonoLocalBinds отключен. В этом случае вычисление типов может быть неустойчивым.

См. статью OutsideIn(X) (раздел 4.2) и Обобщение let для получения дополнительной информации.

Чтобы устранить это предупреждение, вы можете включить MonoLocalBinds или расширение, подразумевающее его (GADTs или TypeFamilies).

Предупреждение также срабатывает при сопоставлении с образцом псевдонима шаблона типа GADT (т. е. псевдонима шаблона, содержащего равенства в предоставленных ограничениях).

В предыдущих версиях GHC (9.2 и ниже) сопоставление с образцом GADT было ошибкой, если не были включены ни GADTs, ни TypeFamilies.

-Wtype-equality-out-of-scope
Since:

9.4.1

По умолчанию:

включено

В соответствии с GHC Proposal #371, синтаксис равенства типов a ~ b больше не встроенный. Вместо этого ~ — это обычный оператор типа, который можно импортировать из Data.Type.Equality или Prelude.

Для минимизации сбоев предоставляется функция обратной совместимости: всякий раз, когда используется ~, но она не в области видимости, компилятор предполагает, что это относится к ограничению равенства типов. Предупреждение срабатывает при любом коде, который полагается на эту функцию обратной совместимости. Его можно решить, явно включив ~ в область видимости.

Вероятная причина — использование NoImplicitPrelude и пользовательского Prelude. В этом случае обновите свой пользовательский Prelude для повторной экспорта ~ из Data.Type.Equality.

-Wtype-equality-requires-operators
Since:

9.4.1

В соответствии с GHC Proposal #371, синтаксис равенства типов a ~ b больше не встроенный. Вместо этого ~ — это обычный оператор типа, который требует расширения TypeOperators.

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

-Wloopy-superclass-solve
Since:

9.6.1

Это предупреждение устарело. Оно больше не оказывает никакого влияния с GHC 9.10. В прошлом UndecidableInstances допускал потенциально бесконечное доказательство для некоторых ограничений надклассов. Это больше не разрешено, как объяснено в Неопределяемые экземпляры и цикличные надклассы. Это предупреждение использовалось в период перехода.

-Wterm-variable-capture
Since:

9.8.1

В режиме RequiredTypeArguments неявная квантификация переменных типов не происходит, если в области видимости есть переменная термина с тем же именем.

Например:

a = 15
f :: a -> a    -- NoRequiredTypeArguments: The ‘a’ is implicitly quantified
               -- RequiredTypeArguments:   The ‘a’ refers to the term-level binding

При включенном -Wterm-variable-capture, GHC предупреждает о неявной квантификации, которая перестанет работать в режиме RequiredTypeArguments.

-Wmissing-role-annotations
Since:

9.8.1

По умолчанию:

выключено

Если вы хотите, чтобы GHC проверял, что каждое определение типа данных имеет метку роли, используйте опцию -Wmissing-role-annotations. Вы можете указать роль с помощью RoleAnnotations.

GHC не будет предупреждать о определениях типов классов с отсутствующими аннотациями ролей, так как их роли по умолчанию являются самыми строгими: все номинальные. Другими словами, роль типа класса не может случайно быть представлена или фиктивной, что может повлиять на корректность кода.

-Wimplicit-rhs-quantification
Since:

9.8.1

По умолчанию:

выключено

В соответствии с GHC Proposal #425, GHC перестанет неявно квантифицировать переменные типов, которые появляются в правой части псевдонима типа, но не упомянуты в левой части. Объявления псевдонимов типов, которые полагаются на эту форму квантификации, следует переписать с помощью невидимых связываний.

Например:

type T1 :: forall a . Maybe a
type T1    = 'Nothing :: Maybe a      -- old
type T1 @a = 'Nothing :: Maybe a      -- new

Это предупреждение обнаруживает код, который будет затронут этим изменением.

-Wdeprecated-type-abstractions
Since:

9.10.1

Default:

выкл.

Абстракции типов в шаблонах конструкторов позволяют привязывать переменные экзистенциального типа:

import Type.Reflection (Typeable, typeRep)
data Ex = forall e. (Typeable e, Show e) => MkEx e
showEx (MkEx @e a) = show a ++ " :: " ++ show (typeRep @e)

Обратите внимание на шаблон MkEx @e a, и, в частности, на связывающий @e.

Поддержка этой функции была добавлена в GHC в версии 9.2, но вместо того, чтобы получить собственное расширение языка, функция была включена с помощью комбинации TypeApplications и ScopedTypeVariables. Согласно предложению GHC #448 и его поправке #604, мы теперь переходим к защите этой функции с помощью TypeAbstractions вместо этого.

В качестве меры совместимости GHC продолжает поддерживать старые программы, использующие абстракции типов в шаблонах конструкторов без включения соответствующего расширения TypeAbstractions, но прекратит это в будущей версии.

Это предупреждение обнаруживает код, который будет затронут этим изменением, нарушающим совместимость.

-Wincomplete-export-warnings
Since:

9.8.1

В соответствии с предложением GHC #134, теперь можно устаревать некоторые экспорты имени без устаревания самого имени.

Как объяснено в предупреждениях и устаревших прагмах, когда имя экспортируется несколькими способами в одном модуле, но только некоторые из этих способов имеют предупреждение, оно не будет устаревать при импорте в другой модуль.

Например:

   module A (x) where

   x :: Int
   x = 2

   module M (
       {-# WARNING x "deprecated" #-} x
       module A
     )
   import A

When :ghc-flag:`-Wincomplete-export-warnings` is enabled, GHC warns about exports
that are not deprecating a name that is deprecated with another export in that module.
-Wbadly-staged-types
Since:

9.10.1

Рассмотрим пример:

tardy :: forall a. Proxy a -> IO Type
tardy _ = [t| a |]

Связывание типа a привязано на стадии 1, но используется на стадии 2.

Это плохо отстаиваемая программа, и tardy (Proxy @Int) не создаст представление типа Int, а скорее локальное имя a.

-Winconsistent-flags
Since:

9.8.1

Default:

вкл.

Выдавать предупреждение, когда параметры командной строки несовместимы каким-либо образом.

Например, при использовании GHCi, оптимизационные флаги игнорируются, и выдается предупреждение. Другой пример — -dynamic игнорируется, когда передается -dynamic-too.

-Wdata-kinds-tc
Since:

9.10.1

Введено в GHC 9.10.1, это предупреждение, когда некорректное использование типа или вида (без включения расширения DataKinds) обнаружено в типе-чекере (отсюда и суффикс -tc). Эти предупреждения дополняют существующие проверки DataKinds (которые существуют с момента первого введения DataKinds), которые приводят к ошибкам вместо предупреждений.

Это предупреждение запланировано на изменение на ошибку в будущей версии GHC, в этот момент флаг -Wdata-kinds-tc будет удален. Пользователи могут включить расширение DataKinds, чтобы избежать проблем (тем самым заглушив предупреждение).

-Wdefaulted-exception-context
Since:

9.10.1

Введено в GHC 9.10.1 с введением неявного контекста Control.Exception.Context.ExceptionContext` для Control.Exception.SomeException. Для сохранения совместимости со старыми компиляторами это ограничение неявно задано по умолчанию в Control.Exception.Context.emptyExceptionContext, когда нет другого доказательства. Поскольку это поведение может привести к потере контекста исключения, это предупреждение предоставляется, чтобы дать знать о возникновении значения по умолчанию.

-Wview-pattern-signatures
Since:

9.12.1

Введено в GHC 9.12.1 в соответствии с предложением GHC #281, этот флаг управляет предупреждением о необрамленных occurrences шаблонов подписей в правой части шаблонов view. Пример:

f (g -> p :: t) = ()

Способ его разбора изменится в будущей версии GHC:

f (g -> (p :: t)) = ()  -- current (legacy) parse
f ((g -> p) :: t) = ()  -- future parse

Если g не является эндофункцией (т.е. её вход и выход имеют одинаковый тип), это нарушит программу.

Чтобы сделать код совместимым с будущими версиями и заглушить предупреждение, пользователям рекомендуется вручную добавить скобки.

Если вы чувствуете себя очень параноиком, -dcore-lint — хороший выбор. Он включает тяжёлые проверки целостности внутри прохода GHC. (Он проверяет целостность GHC, а не вашу.)

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/using-warnings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API