gpt4 book ai didi

haskell - 为什么我可以直接在 REPL 中从 typeclass 实例调用函数(比如从 Ord 进行比较)?

转载 作者:行者123 更新时间:2023-12-03 15:04:48 26 4
gpt4 key购买 nike

当我在像 GHCI 这样的 REPL 中使用 Prelude 时,我会写

*> compare 5 7
LT

为什么我可以直接在 REPL 中调用该函数( compare )?

我知道 compare在类型类 Ord 中定义. Ord 的类型类定义当然表明它是 Eq 的子类.

这是我的推理路线: 5有类型 Num a => a , 和 Num typeclass 不是 Eq 的子类.
还,
Prelude> :t (compare 5)
(compare 5) :: (Num a, Ord a) => a -> Ordering

因此,当我应用数字类型参数时,这里施加了一个额外的约束。当我调用 compare 5 7 , 参数的类型被缩小到确实有 Ord 实例的东西。 .我认为缩小发生在与类型类关联的默认具体类型上:在 Num 的情况下,这是 Integer ,其实例为 Real ,其实例为 Ord .

然而,来自非函数式编程背景,我会想象我必须调用 compare在其中一个数字上(例如在 OOP 中的对象上调用它)。如果 5Integer ,它确实实现了 Ord ,那我为什么要打 compare在 REPL 本身? 这显然是一个与我的范式转变有关的问题,但我仍然没有得到它。希望有人能解释一下。

最佳答案

type defaulting这里开始发挥作用。解释器可以得出 57必须是同一类型,并且 Ord 的成员和 Num类型类。 Num 的默认值是 Integer ,并且由于 IntegerOrd 的一个实例同样,我们可以因此使用 Integer .

解释器因此认为 57成为 Integer s 在这种情况下,因此它可以评估函数并获得 LT .

GHCi 有一些额外的默认规则,在 GHCi documentation 中描述。 .

关于haskell - 为什么我可以直接在 REPL 中从 typeclass 实例调用函数(比如从 Ord 进行比较)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57453638/

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