元组上的OCaml映射

元组上的OCaml映射,ocaml,Ocaml,我的代码中有几个地方如下所示: let (a,b,c) = (f "a", f "b", f "c") 如果我能写一些像这样的东西就好了: let (a,b,c) = map f ("a", "b", "c") 如果在OCaml中有这样做的方法?最好的答案是,如果您想让它适用于不同大小的元组,就不能这样做。每个元组大小在OCaml中都是不同的类型。因此,没有OCaml类型代表“任何大小的元组,其元素都是字符串”的概念 但事实上,这听起来更像是一个列表而不是一个元组。如果可以使用列表而不是元组

我的代码中有几个地方如下所示:

let (a,b,c) = (f "a", f "b", f "c")
如果我能写一些像这样的东西就好了:

let (a,b,c) = map f ("a", "b", "c")

如果在OCaml中有这样做的方法?

最好的答案是,如果您想让它适用于不同大小的元组,就不能这样做。每个元组大小在OCaml中都是不同的类型。因此,没有OCaml类型代表“任何大小的元组,其元素都是字符串”的概念


但事实上,这听起来更像是一个列表而不是一个元组。如果可以使用列表而不是元组,则可以使用普通的旧
List.map
函数。

您可以轻松地为一种类型的元素的三元组编写
map

let map_triple f (a, b, c) = (f a, f b, f c)

let a, b, c = map_triple String.length ("foo", "bar", "quux")
然而,它只适用于一个元组长度


可以编写一个gaddified元组类型,并在元组长度多态的类型上编写一个
map
,但是最好避免这种欺骗,除非优势很大,这里似乎不是这样。

你的
a
b
c
是否始终具有相同的类型?您的
f
是否总是要在同一类型的有序三元组上分发?OCaml的类型系统不支持特定长度的数组或按长度参数化的同质元组。如果我们有这些,那么就可以有一个类型为
('a->'b)->('a,)array->('b,)array
的映射函数,我不介意使用List.map,但我希望能够轻松地将结果绑定到变量:您可以轻松地为每种大小的元组编写一个函数:
让mapt3f(a,b,c)=(fa,fb,fc)
。如果您只有几个尺寸,这可能是一个不错的解决方案。