Почему GHC предупреждает только о частичных реализованных классах, а не об ошибках?

Я думаю, что название уже самоочевидно, но вот пример, чтобы показать свою мысль:

class Foo a where
    someFunction :: a -> a -> Bool

instance Foo Bool

Когда я компилирую это, компилятор выдает предупреждение:

Warning:
    No explicit method or default declaration for `someFunction'
    in the instance declaration for `Foo Bool'

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

Ответ 1

Документация GHC служит примером, где достаточно предупреждения:

-fwarn-missing-methods:

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

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

class C a where
  _simpleFn :: a -> String
  complexFn :: a -> a -> String
  complexFn x y = ... _simpleFn ...

Идея состоит в том, что: (a) пользователи класса будут вызывать только complexFn; никогда _simpleFn; и (b) объявления экземпляров могут определять либо complexFn, либо _simpleFn.

Прагма MINIMAL может использоваться для изменения того, какая комбинация методов потребуется для экземпляров определенного класса. См. Раздел 7.20.5, "МИНИМАЛЬНАЯ прагма" .

То, что причина отсутствующих методов не приводит к ошибке, а предупреждение. Если вы хотите, чтобы предупреждения были фатальными, используйте -Werror. Поскольку нет -ferr-missing-methods, -Werror - единственный способ сделать ошибку -fwarn-missing-methods компилятором.