你不能(Obj
也就是说,不求助于模块的黑魔法)。确实,有两个问题。第一个 OCaml 的类型系统不能表示类似于'a list -> ('a * 'a * ... * 'a)
where...
实际上取决于参数长度的东西(例如,您可以在 Coq 中做类似的事情)。其次,在 OCaml 中,n-uple 不是 pair 的迭代版本,即 type'a * 'a * 'a
的值既不是 type 的值'a * ('a * 'a)
也不是 type的值('a * ('a * 'a))
,因此您无法从列表的元素逐步构建您的 nuple。
# let x = (1,2,3);;
val x : int * int * int = (1, 2, 3)
# let y = (1,(2,3));;
val y : int * (int * int) = (1, (2, 3))
# let z = (1,2),3;;
val z : (int * int) * int = ((1, 2), 3)
# x = y;;
Error: This expression has type int * (int * int)
but an expression was expected of type int * int * int
# x = z;;
Error: This expression has type (int * int) * int
but an expression was expected of type int * int * int