为什么这个类型类只用"-XNoMonomorphismRestriction"编译?

Vla*_*oiu 4 haskell typeclass

我一直在得到一些奇怪的类型类错误,形式为"没有实例(测试a0)来自表达式类型签名".这是我能提出的最简单的违规代码版本:

class Test a where
  test :: a

foo = test
Run Code Online (Sandbox Code Playgroud)

添加类型没有帮助:

foo = test :: Test a => a
Run Code Online (Sandbox Code Playgroud)

但是,添加Test实例会使其编译:

instance Test Int where
  test = 0
Run Code Online (Sandbox Code Playgroud)

这不是真的可以接受,因为我想在其他地方宣布我的实例.

最后,传递-XNoMonomorphismRestriction给ghc(i)也允许它编译.虽然现在已经足够好了,但我不明白这个扩展的作用是什么,为什么有必要,或潜在的缺点.

Ørj*_*sen 10

作为禁用整个文件的单态限制的替代方法(这是相当无害的,但可能会导致某些意外重新计算不是多态的值),添加类型确实有帮助,但您必须将其作为签名在顶层:

foo :: Test a => a
foo = test
Run Code Online (Sandbox Code Playgroud)

如果你刚刚添加它test,它被认为只是子表达式的注释test,并没有关闭foo自身的单态限制.