我的问题与存在模糊类型中间值时的类型类实例推导有关
Prelude> :t fromInteger 0
fromInteger 0 :: Num a => a
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
Prelude> :t (==) (fromInteger 0)
(==) (fromInteger 0) :: (Eq a, Num a) => a -> Bool
Prelude> :t (==) (fromInteger 0) (fromInteger 1)
(==) (fromInteger 0) (fromInteger 1) :: Bool
Prelude> (==) (fromInteger 0) (fromInteger 1)
False
Run Code Online (Sandbox Code Playgroud)
魔法!目前还不清楚是如何或是否a具体,但代码运行成功!
根据类型推断规则,a 上面表示的类型变量彼此成功统一,因为它们Num a在不同的术语中具有兼容的约束.但是,a永远不要绑定到具体类型.我的问题是,在运行时,该(==)函数使用哪个实例字典(或专业化,等等)?
这是Haskell依赖于简单的二进制memcmp样式比较的情况吗?或者它可能只是在其实例列表中选择第一个实例,Num因为理论上它应该无关紧要(只要该实例的代数属性正确实现...)