首页 > 解决方案 > SML 多态模式匹配

问题描述

我有这个

fun my_eq (x:'a,y:'a) = true
  | my_eq (x:'a,y:'b) = false

这是行不通的。但为什么不呢?我的猜测是,是的,它可能会看到x,比如说,an intand yis an inttoo,但不是实际值。这是为什么?有什么方法可以让我拥有多态比较函数吗?

标签: polymorphismsml

解决方案


在典型的函数式语言中,类型是纯静态的,它们的唯一目的是类型检查,而不是影响计算。

这是一个特性,实际上是一个非常基本的特性。它归结为编程语言理论中称为参数的属性。粗略地说,这意味着评估永远不应该依赖于编译时变量的类型。也就是说,当程序不知道静态的具体类型时,它不能检查一个值。

为什么这么好?它提供了关于程序的更强的不变量。例如,您仅从类型就知道'a -> 'a必须是恒等函数(或发散/抛出)。类似的“自由定理”适用于许多其他多态函数。参数化也是先进的基于类型的抽象技术的基础,在这种技术中,您可以保证“不受信任”的函数不会弄乱赋予它的某些值或状态的内部。

而参数化是高效实施的基础。程序不必在运行时传递昂贵的类型信息(类型擦除)。此外,编译器可以为不同类型的值重用相同的表示。作为后者的一个例子,在大多数 SML 实现中,0and falseand ()and []and Noneand 任何数据类型的第一个平面构造函数在运行时都用 0 字表示。如果允许像您这样的功能,这是不可能的。


推荐阅读