polymorphism - SML 多态模式匹配
问题描述
我有这个
fun my_eq (x:'a,y:'a) = true
| my_eq (x:'a,y:'b) = false
这是行不通的。但为什么不呢?我的猜测是,是的,它可能会看到x
,比如说,an int
and y
is an int
too,但不是实际值。这是为什么?有什么方法可以让我拥有多态比较函数吗?
解决方案
在典型的函数式语言中,类型是纯静态的,它们的唯一目的是类型检查,而不是影响计算。
这是一个特性,实际上是一个非常基本的特性。它归结为编程语言理论中称为参数的属性。粗略地说,这意味着评估永远不应该依赖于编译时变量的类型。也就是说,当程序不知道静态的具体类型时,它不能检查一个值。
为什么这么好?它提供了关于程序的更强的不变量。例如,您仅从类型就知道'a -> 'a
必须是恒等函数(或发散/抛出)。类似的“自由定理”适用于许多其他多态函数。参数化也是先进的基于类型的抽象技术的基础,在这种技术中,您可以保证“不受信任”的函数不会弄乱赋予它的某些值或状态的内部。
而参数化是高效实施的基础。程序不必在运行时传递昂贵的类型信息(类型擦除)。此外,编译器可以为不同类型的值重用相同的表示。作为后者的一个例子,在大多数 SML 实现中,0
and false
and ()
and []
and None
and 任何数据类型的第一个平面构造函数在运行时都用 0 字表示。如果允许像您这样的功能,这是不可能的。
推荐阅读
- html - 悬停时动画伪元素
- php - PHP理论中的对象
- javascript - 为什么排序在 React 组件中不起作用
- java - 当我的程序在 BlueJ 中的文本“Gross Pay :”之后遇到“%.2f”时,它“崩溃”了
- xml - XSLT 复制除一个节点外的所有 XML 节点,有条件地修改它
- selenium - 在 docker 中执行机器人测试时见 firefox
- laravel - Laravel 6 表单数组 $request->input() 不起作用
- html - 顶部标题:减少输入宽度
- c++ - 使用位运算符的唯一数字
- c# - 发送大型 JSON 文件 (>1 MB) 时,HttpClient.SendAsync 抛出 System.Net.Http.HttpRequestException