我认为标题已经是自我解释了,但这是一个示例,无论如何要表明我的观点:
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'
调用该函数现在将导致运行时错误。为什么这是一个警告,而不是编译时错误?有没有办法让它成为编译时错误?
答案 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
编译错误的唯一方法。