【问题标题】:In SML, are product types and function types type constructors?在 SML 中,产品类​​型和函数类型是类型构造函数吗?
【发布时间】:2020-08-07 13:51:14
【问题描述】:

在 Ullman 的 SML 书中:

我们可以从旧类型 T1 和 T2 构建新类型,如下所示。

  1. T1 * T2 是“产品”类型,其值为对。该对的第一个组件是 T1 类型,第二个是 T2 类型。

  2. T1 -> T2 是“函数”类型,其值是域类型 T1 和范围类型 T2 的函数。

  3. 我们可以创建新类型,方法是使用某些充当类型构造函数的标识符来跟踪诸如 T1 之类的类型。

    (a) 列表类型构造函数。也就是说,对于每一种类型 T1,都有 另一种类型的 T1 列表,其值是列表,其所有元素都是 T1 型。

    (b) 选项类型构造函数。对于每个类型 T1 都有一个类型 T1 值为 NONE 和 SOME x 的选项,其中 x 是任何类型的值 T1.

    (c) 其他类型构造函数 ref、array 和 vector。

我想知道产品类型中的 * 和函数类型中的 -> 是否被视为类型构造函数?

如果不是,为什么?

谢谢。

【问题讨论】:

    标签: types functional-programming programming-languages sml ml


    【解决方案1】:

    它们不是,但这主要是出于句法原因:

    • *-> 是关键字而不是标识符(抛开不相关的使用 * 作为标识符,例如 3 * 4 = 12)。
    • 我们写int * realint -> real而不是(int, real) *(int, real) ->
    • 类型构造函数有固定数量的参数(例如,list 总是有一个参数——我们不能写成(int, real) list——而int 总是没有参数),但int * real * char * string 是一个 4-元组。 (换句话说:* 对于任何 n ≥ 2 的 n 元组类型都是“重载”的。所以它就像 infinitely many 类型构造函数,而不仅仅是一个。)

    但我认为没有任何理由必须这样。可以想象标准 ML 的平行宇宙版本:

    • 没有将*-> 定义为保留字,而只是作为初始基础中的标识符(类似于refint)。
    • 允许将类型构造函数设为中缀(类似于3 + 4 表示op+ (3, 4)),并声明*->
    • 不支持三种或更多类型产品的* 表示法,而是将int * real * char * string 解释为((int * real) * char) * string。 (在我们的宇宙中,'a * 'b * … * 'n 只是 { 1: 'a, 2: 'b, …, 14: 'n } 的语法糖;也许在平行宇宙中,它对三种或更多类型的产品不太有用?)

    事实上,即使在我们自己的宇宙中,我们也可以这样写:

    type ('a, 'b) pair = 'a * 'b
    type ('a, 'b, 'c) triple = 'a * 'b * 'c
    type ('a, 'b) function = 'a -> 'b
    

    它创建类型构造函数pairtriplefunction,使得(int, real) pairint * real同义,(int, real, char) tripleint * real * char同义,(int, real) function456与@986同义@。 (不是任何人想要那样。)

    【讨论】:

    • 谢谢。它们不是类型构造函数,那么它们叫什么? “类型构造器关键字”?
    • @Tim:我不知道他们作为一个团体的名称。 定义 绝对不会将它们视为一个群体;它实际上只是在附录中定义了int * real * char,作为{ 1: int, 2: real, 3: char } 的语法糖。我也从未见过其他人将他们视为一个群体。它们只是两种不同的语法,具有两种不同的相关语义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多