我对SML还不是很熟悉,想确保自己真正掌握基础知识。在SML中,类型(type)和数据类型(datatype)有什么区别,何时应该使用哪个?
type
声明只是给现有类型另一个名称。声明type t = int * int
意味着你现在可以用t
代替int * int
- 它实际上并没有提供任何功能。
datatype
定义允许您通过引入新的数据构造函数来创建全新的类型。数据构造函数是您用于创建和模式匹配值的关键字和符号,例如列表类型的nil
和::
。这些标识符并没有什么特别之处;您可以像这样轻松地自己定义它们:
datatype 'a list = nil | :: of 'a * 'a list
sml中的数据类型可以有多个类型,例如:
datatype a = SomeType | SomeOtherType
当进行类型检查时,您可以使用它们,例如:
fun doThings (var : a) : bool =
case var of
(SomeType) => true
(SomeOtherType) => false
datatype
用于具有构造函数的类型,因此可以在表达式的模式匹配中进行解构。
如果datatype
实现了不透明类型(在签名中使用type
声明并在实现签名的结构中定义为datatype
),则可能会公开一个简单的类型视图。
像int
和word
这样的原子类型在某些方面可以被看作是可析构的类型,例如使用Peano算术解释数字,但是SML的int
、word
和不那么称职的real
是原始类型。
nil
和::
是数据构造函数,而类型构造函数是带有参数的类型,比如list
本身。 - Andreas Rossberg