为什么GHC只警告部分实现的类,而不是错误?

时间:2015-03-25 10:45:52

标签: haskell ghc typeclass

我认为标题已经是自我解释了,但这是一个示例,无论如何要表明我的观点:

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 个答案:

答案 0 :(得分:8)

GHC documentation提供了警告足够的示例:

  

-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 pragma可用于更改特定类实例所需的方法组合。见Section 7.20.5, “MINIMAL pragma”.

这就是缺少方法不会导致错误的原因,而是一个警告。如果您想使警告致命,请使用-Werror。由于没有-ferr-missing-methods-Werror是使-fwarn-missing-methods编译错误的唯一方法。