在GHCi中,以下代码可以正常工作:
f1 :: Float
f1 = f2
-- f2 :: Float
f2 = 1/1
Run Code Online (Sandbox Code Playgroud)
但是在Hugs中,我遇到了一个类型错误 - 它想成为一个Double.当我取消注释f2的类型签名时,它工作正常.
不应该完全按照类型推断这个吗?
这是Hugs中的一个错误吗?
我检查出的类型/和的实例Double和Float- /适用于FractionalS,并且有两个一个分数的实例Double和Float,所以这不应该成为问题.
当没有类型签名绑定时,f2具有多态推断类型(Fractional a => a),由于单态限制必须是单态的(除非禁用).在没有其他默认声明的情况下,具有Fractional约束的类型变量默认为Double.Hugs似乎首先进行默认操作,然后阻止将声明绑定Float f1到Double值的尝试f2.GHC看起来更进一步,看到它f2在类型中使用Float,因此是单态f2的Float.
我不知道我想什么样的行为在这种情况下,语言标准规定,但GHC的是正确的,因为monomorphising应键入结合基团后才会出现,我认为f1并f2一起形成约束力组,因为f1用途f2.