SML 多态模式匹配
SML polymorphic pattern matching
我有这个
fun my_eq (x:'a,y:'a) = true
| my_eq (x:'a,y:'b) = false
这是行不通的。但为什么不呢?我的猜测是,是的,它可能会看到 x
是一个 int
并且 y
也是一个 int
,但不是实际值。这是为什么?有什么方法可以让我拥有多态比较函数吗?
类型在典型的函数式语言中是纯静态的,它们的唯一目的是类型检查,不影响计算。
这是一个功能,实际上是一个非常基本的功能。它归结为一种属性,在编程语言理论中被称为参数化。粗略地说,这意味着求值不应该依赖于在编译时是变量的类型。也就是说,程序无法静态地知道其具体类型时无法检查值。
为什么这么好?它给出了关于程序的更强大的不变量。例如,您仅从类型就知道 'a -> 'a
必须是恒等函数(或 diverges/throws)。类似 "free theorems" 适用于许多其他多态函数。参数化也是基于类型的高级抽象技术的基础,在这种技术中,您可以保证 "untrusted" 函数不会与赋予它的某些值或状态的内部结构混淆。
而参数化是高效实现的基础。程序不必在 运行 时间传递昂贵的类型信息(类型擦除)。此外,编译器可以为不同类型的值重用相同的表示。作为后者的一个例子,在大多数 SML 实现中,0
and false
and ()
and []
and None
and the first flat constructor of any datatype are在 运行 时间全部由 0 字表示。如果允许像您这样的功能,这是不可能的。
我有这个
fun my_eq (x:'a,y:'a) = true
| my_eq (x:'a,y:'b) = false
这是行不通的。但为什么不呢?我的猜测是,是的,它可能会看到 x
是一个 int
并且 y
也是一个 int
,但不是实际值。这是为什么?有什么方法可以让我拥有多态比较函数吗?
类型在典型的函数式语言中是纯静态的,它们的唯一目的是类型检查,不影响计算。
这是一个功能,实际上是一个非常基本的功能。它归结为一种属性,在编程语言理论中被称为参数化。粗略地说,这意味着求值不应该依赖于在编译时是变量的类型。也就是说,程序无法静态地知道其具体类型时无法检查值。
为什么这么好?它给出了关于程序的更强大的不变量。例如,您仅从类型就知道 'a -> 'a
必须是恒等函数(或 diverges/throws)。类似 "free theorems" 适用于许多其他多态函数。参数化也是基于类型的高级抽象技术的基础,在这种技术中,您可以保证 "untrusted" 函数不会与赋予它的某些值或状态的内部结构混淆。
而参数化是高效实现的基础。程序不必在 运行 时间传递昂贵的类型信息(类型擦除)。此外,编译器可以为不同类型的值重用相同的表示。作为后者的一个例子,在大多数 SML 实现中,0
and false
and ()
and []
and None
and the first flat constructor of any datatype are在 运行 时间全部由 0 字表示。如果允许像您这样的功能,这是不可能的。