N-ary元组vs对

Joh*_*ers 8 f# ocaml tuples ml

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

# 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))
Run Code Online (Sandbox Code Playgroud)

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

# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*rop 8

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

ML类型系统的设计是为了追求更强大的静态类型检查,以便在编译时捕获尽可能多的错误.

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

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