我认为标题已经很容易说明了,但是无论如何这是一个例子来说明我的观点:
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'
现在,调用该函数将导致运行时错误。为什么这是警告,而不是编译时错误?有什么办法可以使它成为编译时错误吗?
所述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
编译器错误的唯一方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句