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

标签 haskell typeclass

我收到了一些奇怪的类型类错误,形式为“没有由表达式类型签名引起的(测试 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/

相关文章:

haskell - 是否有用于获取 monad 的转换器版本的库或类型类?

haskell - 在 Gloss 中设置 OpenGL 窗口提示

scala - 如何使用属性和类型类无形的案例类?

haskell - MultiParamTypeClasses - 为什么这个类型变量不明确?

scala - Shapeless 中 TypeClass 特征的 emptyCoproduct 和 coproduct 方法的目的是什么

Haskell 性能 : Composition vs Application?

function - Haskell 中 where 表示法的好处

parsing - 从右到左解析表达式

syntax-error - idris 接口(interface)语法

haskell - 如何在 Haskell 中正确实例化类?