has*_*lHQ 2 polymorphism haskell type-inference ambiguity
代码
default ()
h :: Bool
h = 1.0 == 1.0 --Error. Ambiguity.
Run Code Online (Sandbox Code Playgroud)
不编译.这是预料之中的,因为存在歧义.它可能是Float或者Double和Haskell不知道我们想要哪一个.
但是代码
default ()
foo :: (Fractional a, Eq a) => a -> Bool
foo x = x == 1.0
Run Code Online (Sandbox Code Playgroud)
编译成功.我不完全明白为什么.为什么这也不明确?
我有一种感觉,这是因为每当我们打电话foo,我们都保证到位的已经选择了一个具体类型a,即,我们都保证有固定a要么Float或Double(有两个实例,或者我们的自定义类型Fractional和Eq编译) - 时间,因此没有歧义.
但这只是一种感觉,我不知道它是否100%准确.
Ale*_*nov 10
Haskell报告的第4.3.4节给出了这种情况下歧义的定义:
我们说一个表达式
e有一个模糊的类型,如果在它的类型forall us. cx => t,有一种类型的变量u在us发生在cx,但不是t.这些类型无效.
在foo :: (Fractional a, Eq a) => a -> Bool,没有这样的变量(因为a发生a -> Bool).1.0 == 1.0实际上在类型中(Fractional a, Eq a) => Bool,所以存在这样的变量.
该原因这种不确定性的一个错误是因为没有办法对编译器的变量的不同实例之间进行选择a,程序的结果可能取决于哪一个选择.在这种情况下1.0 == 1.0应始终True用于任何合理的实例化,但1)编译器不知道这一点; 2)并非所有实例都是合理的.