gpt4 book ai didi

haskell - 当中间值从未具体键入时,Haskell 编译器如何为 `(==) (fromInteger 0) (fromInteger 0)` 发出代码?

转载 作者:行者123 更新时间:2023-12-01 08:45:53 26 4
gpt4 key购买 nike

我的问题与存在类型不明确的中间值的情况下的类型类实例推导有关

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

魔法!尚不清楚 a 如何或是否已具体化,但代码运行成功!

根据类型推断规则, a 表示的类型变量以上由于兼容 Num a,所以相互统一成功不同条款的约束。但是, a从不绑定(bind)到具体类型。我的问题是,在运行时, (==) 使用哪个实例字典(或特化,等等)功能?

这是 Haskell 依赖简单二进制的情况吗? memcmp风格比较?或者它只是在其列表 Num 中选择第一个实例。实例,因为理论上它应该无关紧要(只要该实例的代数属性被正确实现......)

最佳答案

是的,它是由 defaulting 制成的混凝土,这几乎是你的第二个理论。

The expression [..] is ambiguous because the literal 4 is of Num a => a type in Haskell. 4 can be an Int, a Float or any other type that is an instance of Num, so the compiler can’t choose any particular type for the same reason above. But the Haskell Committee thought that this is too much restriction. After much debates, they compromised and added an ad-hoc rule for choosing a particular default type.



(尽管选择哪个实例很重要。例如,如果选择了 2^64 == 0,则 TrueInt,但如果选择了 False,则 IntegerInteger 是默认列表中的第一个,这是有充分理由的。 )

关于haskell - 当中间值从未具体键入时,Haskell 编译器如何为 `(==) (fromInteger 0) (fromInteger 0)` 发出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54000708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com