Mercury是一种纯逻辑编程语言,具有类似于 Haskell 的类型系统。
Mercury 中的求值是严格的而不是惰性的,因此 Mercury 的和等价物之间没有语义差异。因此,任何碰巧只有一个构造函数和一个参数的类型都表示为与该参数的类型相同,但仍被视为相同类型;实际上,“newtype”是 Mercury 中的一种透明优化。例子:newtype
data
:- type wrapped
---> foo(int)
; bar(string).
:- type wrapper ---> wrapper(wrapped).
:- type synonym == wrapped.
will的表示形式与 of 的表示wrapper
相同,wrapped
但它是一个不同的类型,与之相反,synonym
它只是 type 的另一个名称wrapped
。
Mercury 在其表示中使用标记指针。1由于严格并允许对不同类型有不同的表示,Mercury 通常会尽可能地取消拳击。例如
- 要引用“类枚举”类型的值(所有空构造函数),您不需要指向任何内存,因此您可以使用整个单词的标记位来说明它是哪个构造函数并将其内联到参考
- 要引用列表,您可以使用指向 cons 单元格的标记指针(而不是指向本身包含有关它是 nill 还是 cons 单元格的信息的结构的指针)
- ETC
“新型”优化实际上只是该一般思想的一种特殊应用。“包装”类型不需要分配任何高于已包含“包装”类型的内存单元。并且由于它需要零标签位,它还可以在对“包装”类型的引用中适合任何标签。因此,对“包装”类型的整个引用可以内联到对包装类型的引用中,最终在运行时无法区分。
1此处的详细信息可能仅适用于低级 C 编译等级。Mercury 还可以编译为“高级”C 或Java。显然,Java 中没有任何问题(尽管据我所知“新类型”优化仍然适用),而且我对高级 C 级别的实现细节不太熟悉。