我收到了一些奇怪的类型类错误,形式为“没有由表达式类型签名引起的(测试 a0)的实例”。这是我能想到的违规代码的最简单版本:
class Test a where
test :: a
foo = test
添加类型没有帮助:
foo = test :: Test a => a
但是,添加一个 Test 实例确实可以编译:
instance Test Int where
test = 0
这不是真的可以接受,因为我希望我的实例在其他地方声明。
最后,将
-XNoMonomorphismRestriction
传递给 ghc(i) 也允许它进行编译。虽然现在这已经足够好了,但我不明白这个扩展有什么作用,为什么有必要,或者可能潜伏着什么缺点。
最佳答案
作为禁用整个文件的单态限制的替代方法(这是相当无害的,但可能会导致一些非多态的值的意外重新计算),添加类型确实有帮助,但您必须将其作为签名在顶级:
foo :: Test a => a
foo = test
如果在
test
之后添加它,它被认为只是子表达式 test
上的一个注释,并且不会关闭 foo
本身的单态限制。
关于haskell - 为什么这个类型类只能用 "-XNoMonomorphismRestriction"编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25634226/