8

在 Ocaml 中,具有不同元组的元组具有不同的类型和值构造函数:

# let a = (1, 2, 3);;
val a : int * int * int = (1, 2, 3)
# let b = (1, (2, 3));;
val b : int * (int * int) = (1, (2, 3))

请注意,第二个示例 (b) 比第一个 (a) 更灵活,因为 b - (2, 3) 的“尾部” - 本身是有效值:

# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)

为什么不将 "(1, 2, 3)" 解析为 "(1, (2, 3))" 而是为不同的 arities 引入无限(或者更糟糕的是,有限)数量的新类型和值构造函数?

4

1 回答 1

8

为什么不将 "(1, 2, 3)" 解析为 "(1, (2, 3))" 而是为不同的 arities 引入无限(或者更糟糕的是,有限)数量的新类型和值构造函数?

ML 类型系统旨在追求更强大的静态类型检查,以便在编译时捕获尽可能多的错误。

(1, 2, 3)您的建议会大大削弱类型系统,因为它将不再能够区分(1, (2, 3))哪个是相反方向的移动。

在实践中,我可以告诉你,ML 做出这样的区分过去在我的生产代码中发现了真正的错误。在这种情况下,我重视 ML 设计。

于 2013-01-31T19:40:04.233 回答