我是SML的新手,我想确保我真正了解基础知识 . SML中的类型和数据类型有什么区别,以及何时使用哪个?
type 声明只是为现有类型指定另一个名称 . 声明 type t = int * int 只是意味着您现在可以编写 t 而不是 int * int - 它实际上并不提供任何功能 .
type
type t = int * int
t
int * int
datatype definitions允许您通过引入新的数据构造函数来创建全新的类型 . 数据构造函数是用于创建和模式匹配值的关键字和符号,例如列表类型的 nil 和 :: . 这些标识符没有什么特别之处;你可以像这样轻松地定义它们:
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
您可以将其视为:type类型用于opaque和atomic类型,而 datatype 用于带有构造函数的类型,因此可以进行解构,主要是在表达式上的模式匹配中 .
如果它实现了一个opaque类型(在签名中用 type 声明并在实现签名的结构中定义为 datatype ),那么 datatype 也可以公开一个简单的类型视图 .
像 int 和 word 这样的原子类型在某些方面可能被视为可破坏类型,例如Peano对数字的算术解释,但SML的 int , word 和不那么好称为 real 的是原始类型 .
int
word
real
3 回答
type
声明只是为现有类型指定另一个名称 . 声明type t = int * int
只是意味着您现在可以编写t
而不是int * int
- 它实际上并不提供任何功能 .datatype
definitions允许您通过引入新的数据构造函数来创建全新的类型 . 数据构造函数是用于创建和模式匹配值的关键字和符号,例如列表类型的nil
和::
. 这些标识符没有什么特别之处;你可以像这样轻松地定义它们:sml中的数据类型可以有多种类型,例如
您可以在类型检查时使用它们,例如
您可以将其视为:type类型用于opaque和atomic类型,而
datatype
用于带有构造函数的类型,因此可以进行解构,主要是在表达式上的模式匹配中 .如果它实现了一个opaque类型(在签名中用
type
声明并在实现签名的结构中定义为datatype
),那么datatype
也可以公开一个简单的类型视图 .像
int
和word
这样的原子类型在某些方面可能被视为可破坏类型,例如Peano对数字的算术解释,但SML的int
,word
和不那么好称为real
的是原始类型 .