F# N元元组对

F# N元元组对,f#,ocaml,tuples,ml,F#,Ocaml,Tuples,Ml,在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) # l

在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)),而是为不同的算术引入无限(或者更糟糕的是,有限)数量的新类型和值构造函数

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

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

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


在实践中,我可以告诉您,在过去的生产代码中,进行这种区分的ML捕捉到了真正的错误。在此背景下,我重视ML设计。

您所描述的基本上是一个列表,除非您允许使用不同类型的组件。然而,在这种情况下,提议的元组构造也将引入无限多个不同的类型。