Types SML:类型和数据类型之间的差异

Types SML:类型和数据类型之间的差异,types,sml,smlnj,Types,Sml,Smlnj,我是SML的新手,我想确保我真正了解基本知识。SML中的类型和数据类型有什么区别,何时使用哪种类型?SML中的数据类型可以有多个类型,例如 datatype a = SomeType | SomeOtherType 您可以在类型检查时使用它们,例如 fun doThings (var : a) : bool = case var of (SomeType) => true (SomeOtherType) => false type声明只是为现有

我是SML的新手,我想确保我真正了解基本知识。SML中的类型和数据类型有什么区别,何时使用哪种类型?

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

datatype a = SomeType | SomeOtherType
您可以在类型检查时使用它们,例如

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

type
声明只是为现有类型提供了另一个名称。声明
type t=int*int
仅仅意味着您现在可以编写
t
而不是
int*int
——它实际上不提供任何功能

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

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

您可能会这样想:类型用于不透明和原子类型,而
datatype
用于带构造函数的类型,因此,可以对其进行分解,主要是在表达式的模式匹配中

如果
datatype
实现了不透明类型(在签名中用
type
声明,在实现签名的结构中定义为
datatype
),那么
datatype也可能公开简单的类型视图


int
word
这样的原子类型在某些方面可能被视为可分解的类型,比如数字的Peano算术解释,但SML的
int
word
和不太好的
real
,是基元类型。

One nit:
nil
是数据构造函数。类型构造函数是带有参数的类型,例如
list
本身。