类型构造器和数据类型之间的区别和关系是什么?

问题描述 投票:0回答:1

在Ullman的SML书中。

  • 9.3.2 基元类型构造器 列表作为类型构造器。ref, arrayvector,

  • 9.3.3 原始数据类型 作为数据类型的列表。bool, list, optionorder.

  • 6.1.1 多边形系统的审查 列表作为类型构造器。list, option, ref, arrayvector.

问题:

  1. 是否 listsoption 数据类型、类型构造器,还是两者都有?

  2. 类型构造函数和数据类型之间的区别和关系是什么?我对下面的引文感到困惑。

    第六章 定义你自己的类型 说。

    数据类型定义是构建新类型的规则,新类型的值不是以前定义的类型的值。

    2.4 图元组和列表 说。

    大多数语言都从类似的类型集合开始,并通过一组称为类型构造器的操作符建立更复杂的类型,这些操作符是允许我们从更简单的类型中定义新类型的字典。

  3. 如果类型构造函数和数据类型可以重叠,那么类型构造函数的相反(互斥)概念是什么,数据类型的相反(互斥)概念是什么?

谢谢。

types programming-languages sml ml
1个回答
1
投票

希望这个答案是合理的。

  1. listoption 都是类型构造器,因为它们为了构造一个类型而取一个(前缀)类型。所以,它们都是类型构造函数,因为它们取(前缀)类型来构造类型。int list 是一种类型,但 list 本身就是一个类型构造函数。这同样适用于 optionint option,等等。

    在Haskell和可能其他面向类型的语言中,你会说是 int option 有种 Typeoption 有种 Type -> Type. 类型之于类型,就像类型之于值一样,是对所有类型的一种说法。

    所以我相信,当你说 "list是一种类型 "时,这只是松散的说法。你真正的意思是"α list 是任何类型的类型 α". 有时你还特指"'a list 是一种 "与 'a 是一个类型变量。不同的是,我所说的α是指一些具体的类型,而我所说的 'a 我指的是一些类型变量。

  2. 当你创建一个数据类型时。datatype troolean = True | False | Derp那么 troolean 是一种类型和 True等,都是(空值)值构造器。

    当你创建一个数据类型时。datatype fiat = USD of int | ChildDrawing of png那么 fiat 是一种类型和 Dollar 是一个值构造函数,类型为 int -> fiat.

    当你创建一个数据类型时。datatype ('a, 'b) either = Left of 'a | Right of 'b那么 ('a, 'b) either 是一种类型。either 是一个类型构造函数(它接受两个类型参数并构造一个类型,但通俗地说,"任何一个都是一个类型")。LeftRight 仍然是值构造函数。

    我不知道你对引号有什么困惑。数据类型让你可以用新的值创建新的类型,而这些新的值并不存在(但该类型最肯定的是与存在的某个类型同构)。类型的组成仍然是可能的,但更加强大,因为你可以组成你自己制作的类型,以获得很高的精度和表现力。

    我想你可以称之为 troolean 也是空类型构造函数,但如果说是 troolean种类是 Type 并且 either的类型是... 什么?

  3. 如果类型构造函数和数据类型可以重叠的话

    我不确定你能这么说。数据类型定义了新的值。有时这些值有值参数。有时数据类型本身也有类型参数。当它有的时候,它的类型构造函数有一个更高的种类。

© www.soinside.com 2019 - 2024. All rights reserved.