2015-12-13 37 views
2

我在我的代码的几个地方,看起来是这样的:OCaml的地图

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

这将是很好,如果我可以写这样的:

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

如果有办法在OCaml中做这样的事情?

+0

你的'a','b'和'c'会有相同的类型吗?你的'f'总是打算在相同类型的有序三元组上分配吗? – Shredderroy

+0

OCaml的类型系统不支持特定长度的数组或由它们的长度参数化的同质元组。如果我们有这些,那么可以有一个单一的映射函数,类型为'('a - >'b) - >('a,)array - >('b,)array' –

回答

5

你可以随便写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") 

它只会为元组的一个长度,但是。

这将是可能的写GADTified元组类型和编写一个map在该元组的长度多态的类型,但这种欺骗是最好的避免,除非优势很大,似乎并没有在这里就是这种情况。

5

最好的答案是你不能这样做,如果你想让它适用于不同大小的元组。每个元组大小在OCaml中都是不同的类型。所以没有OCaml类型表示“元素是字符串的任何大小的元组”的想法。

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

+0

我不介意使用List .map,但我希望能够轻松地将结果绑定到变量: – krokodil

+1

您可以轻松地为每个元组的大小写一个函数:'let mapt3 f(a,b,c)=(fa,fb,fc)'。如果你只有几个尺寸,这可能是一个体面的解决方案。 –