4

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

f1 :: Float
f1 = f2

-- f2 :: Float
f2 = 1/1

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

不应该完全关注类型推断吗?

这是拥抱中的错误吗?

我检查了and -适用于s 的类型/和实例,并且and 都有一个 Fractional 实例,所以这应该不是问题。DoubleFloat/FractionalDoubleFloat

4

1 回答 1

7

在没有类型签名的情况下绑定时,f2具有多态推断类型 ( Fractional a => a),由于单态限制,它必须是单态的(除非被禁用)。在没有其他默认声明的情况下,具有Fractional约束的类型变量默认为Double. Hugs 似乎首先进行默认设置,然后在尝试将声明的绑定Float f1Doublevalue时窒息f2。GHC 进一步观察,发现它用于f2type Float,因此单态化为.f2Float

我不确定在这种情况下语言标准要求什么行为,但我认为 GHC 是正确的,因为单态应该只在键入绑定组后发生,而且我认为它f1f2一起形成一个绑定组,因为f1使用f2.

于 2012-03-26T16:04:22.993 回答