haskell - 为什么我可以直接在 REPL 中从 typeclass 实例调用函数(比如从 Ord 进行比较)?
问题描述
当我在像 GHCI 这样的 REPL 中使用 Prelude 时,我会写
*> compare 5 7
LT
为什么我可以compare
直接在 REPL 中调用该函数 ()?
我知道这compare
是在 typeclass 中定义的Ord
。的 typeclass 定义Ord
当然表明它是Eq
.
这是我的推理:
5
有 type 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 中的对象上调用它一样)。如果5
是Integer
,它确实实现Ord
了,那么我为什么要调用compare
REPL 本身呢?这显然是一个与我的范式转变有关的问题,但我仍然没有得到它。希望有人能解释一下。
解决方案
推荐阅读
- javascript - 在 pdf.js 中完成加载之前渲染 pdf
- ios - Pod:新协议文件正确添加到项目中,但在导入模块定义中被忽略
- gcc - 没有为 arm-none-eabi 找到符号“__aeabi_uidiv”
- sql - 在运行更新存储过程之前使用预先存在的数据加载视图以编辑记录?
- python - mock.patch() 作为装饰器和上下文管理器的区别
- python - 如何简单地使用蚁群优化来找到函数的最小值?
- angular - Angular 6 错误显示
不是已知元素 - android - 在 Xamarin (Android) 中获取附加的 USB 设备信息
- node.js - 需要使用node.js函数检索存储在谷歌云存储桶中的所有文件Urls(所有文件)
- tensorflow - 使用 TPU 在 Google Colab 上训练对象检测模型