在GHCi中,以下代码可以正常工作:
f1 :: Float
f1 = f2
-- f2 :: Float
f2 = 1/1
但在Hugs中,我遇到了类型错误 - 它想成为一个Double。当我取消注释f2的类型签名时,它工作正常。
不应该完全按照类型推断进行处理吗?
这是Hugs中的错误吗?
我查看了/
的类型,Double
和Float
- /
的实例适用于Fractional
,并且有一个Fractional实例对于Double
和Float
,所以这不应该是问题。
答案 0 :(得分:7)
当绑定没有类型签名时,f2
具有多态推断类型(Fractional a => a
),由于单态限制(除非禁用),因此必须单态化。在没有其他默认声明的情况下,具有Fractional
约束的类型变量默认为Double
。 Hugs似乎首先进行默认操作,然后阻止尝试将声明的Float
f1
绑定到Double
值f2
。 GHC会进一步查看并看到f2
在Float
类型中使用,因此单f2
到Float
。
我不确定语言标准在这种情况下要求的行为,但我认为GHC是正确的,因为单态化应该只在键入一个绑定组后发生,我认为f1
和{{1 }}一起形成一个绑定组,因为f2
使用f1
。