SML: 类型和数据类型的区别

18

我对SML还不是很熟悉,想确保自己真正掌握基础知识。在SML中,类型(type)和数据类型(datatype)有什么区别,何时应该使用哪个?

3个回答

24

type声明只是给现有类型另一个名称。声明type t = int * int意味着你现在可以用t代替int * int - 它实际上并没有提供任何功能。

datatype定义允许您通过引入新的数据构造函数来创建全新的类型。数据构造函数是您用于创建和模式匹配值的关键字和符号,例如列表类型的nil::。这些标识符并没有什么特别之处;您可以像这样轻松地自己定义它们:

datatype 'a list = nil | :: of 'a * 'a list

4
一个小修改:nil::是数据构造函数,而类型构造函数是带有参数的类型,比如list本身。 - Andreas Rossberg

3

sml中的数据类型可以有多个类型,例如:

datatype a = SomeType | SomeOtherType

当进行类型检查时,您可以使用它们,例如:

fun doThings (var : a) : bool =
    case var of
       (SomeType) => true
       (SomeOtherType) => false

1
您可以将其视为:类型用于不透明和原子类型,而datatype用于具有构造函数的类型,因此可以在表达式的模式匹配中进行解构。

如果datatype实现了不透明类型(在签名中使用type声明并在实现签名的结构中定义为datatype),则可能会公开一个简单的类型视图。

intword这样的原子类型在某些方面可以被看作是可析构的类型,例如使用Peano算术解释数字,但是SML的intword和不那么称职的real是原始类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接