拥抱`/`与类型推断

时间:2012-03-26 15:09:25

标签: haskell hugs

在GHCi中,以下代码可以正常工作:

f1 :: Float
f1 = f2

-- f2 :: Float
f2 = 1/1

但在Hugs中,我遇到了类型错误 - 它想成为一个Double。当我取消注释f2的类型签名时,它工作正常。

不应该完全按照类型推断进行处理吗?

这是Hugs中的错误吗?

我查看了/的类型,DoubleFloat - /的实例适用于Fractional,并且有一个Fractional实例对于DoubleFloat,所以这不应该是问题。

1 个答案:

答案 0 :(得分:7)

当绑定没有类型签名时,f2具有多态推断类型(Fractional a => a),由于单态限制(除非禁用),因此必须单态化。在没有其他默认声明的情况下,具有Fractional约束的类型变量默认为Double。 Hugs似乎首先进行默认操作,然后阻止尝试将声明的Float f1绑定到Doublef2。 GHC会进一步查看并看到f2Float类型中使用,因此单f2Float

我不确定语言标准在这种情况下要求的行为,但我认为GHC是正确的,因为单态化应该只在键入一个绑定组后发生,我认为f1和{{1 }}一起形成一个绑定组,因为f2使用f1