【问题标题】:What `type variables` means when they occurred in `val` declaration statement in SML当它们出现在 SML 中的 `val` 声明语句中时,`type variables` 是什么意思
【发布时间】:2015-06-09 02:05:52
【问题描述】:

在 SML/NJ repl 中,接受以下表达式:

- val 'a a = [];
val a = [] : 'a list
- val 'a a = 1;
val a = 1 : int

这里的'a 是什么意思?我不知道他们会产生什么效果,这个定义在定义中,但是我在Programming in Standard ML中找不到相关的描述。

请!

【问题讨论】:

  • 变量因值而异:变量“x”,假设其类型为 int,它的值可以是 1、2、3、4 或任何其他 int。类型变量因类型而异:'列表是具有未知基类型的列表的类型。当您想要一个不关心参数的基本类型的函数时,它们就会发挥作用,例如对于长度函数,它是否计算 int 列表或 char 列表的长度并不重要。每当您看到一个类型变量时,您都可以将其解释为它代表任何类型...即,它有助于为多态函数提供类型。

标签: sml


【解决方案1】:

val 绑定的类型变量仅在您使用它们时才相关。您可以使用它们强制(或限制)多态性,例如

fun 'a pair (x : 'a, y : 'a) = (x, y)

简称

val 'a pair = fn (x : 'a, y : 'a) => (x, y)

您可以编写相同的内容,而无需在开头添加明确的'a。但是,范围规则相当棘手,尤其是当您在多个声明中使用'a 时。例如:

fun f () =
    let
        fun pair (x : 'a, y : 'a) = (x, y)
        fun triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
    in
        ...
    end

这是什么意思?至少有两种可能的答案:

fun f () =
    let
        fun 'a pair (x : 'a, y : 'a) = (x, y)
        fun 'a triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
    in
        ...
    end

fun 'a f () =
    let
        fun pair (x : 'a, y : 'a) = (x, y)
        fun triple (x : 'a, y : 'a, z : 'a) = (x, y, z)
    in
        ...
    end

在前一种情况下,pairtriple 在单态 f 中都是完全多态的,在后一种情况下,它们将是单态的,相对于(多态)f 的实例化!

答案是 SML 实际上选择了后一种解释:如果您在没有显式绑定点的注释中使用类型变量,那么它的范围是 包含同一变量的所有出现的最小封闭声明。

有时这甚至是您想要的。但显然,最好能够明确地说明它,而不是依赖于棘手的隐式范围规则。

【讨论】:

  • 我知道了,非常感谢。顺便说一句,你能告诉我在哪里可以获得关于 SML 的多态和单态知识的系统描述吗?我不知道编译器和类型检查器是如何工作的。谢谢。
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2014-09-03
  • 1970-01-01
  • 2016-03-22
  • 2020-05-14
相关资源
最近更新 更多