我在我的代码的几个地方,看起来是这样的:OCaml的地图
let (a,b,c) = (f "a", f "b", f "c")
这将是很好,如果我可以写这样的:
let (a,b,c) = map f ("a", "b", "c")
如果有办法在OCaml中做这样的事情?
我在我的代码的几个地方,看起来是这样的:OCaml的地图
let (a,b,c) = (f "a", f "b", f "c")
这将是很好,如果我可以写这样的:
let (a,b,c) = map f ("a", "b", "c")
如果有办法在OCaml中做这样的事情?
你可以随便写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
在该元组的长度多态的类型,但这种欺骗是最好的避免,除非优势很大,似乎并没有在这里就是这种情况。
最好的答案是你不能这样做,如果你想让它适用于不同大小的元组。每个元组大小在OCaml中都是不同的类型。所以没有OCaml类型表示“元素是字符串的任何大小的元组”的想法。
但实际上这听起来像是一个多于一个元组的列表。如果您可以使用列表而不是元组,则可以使用普通旧的List.map
函数。
我不介意使用List .map,但我希望能够轻松地将结果绑定到变量: – krokodil
您可以轻松地为每个元组的大小写一个函数:'let mapt3 f(a,b,c)=(fa,fb,fc)'。如果你只有几个尺寸,这可能是一个体面的解决方案。 –
你的'a','b'和'c'会有相同的类型吗?你的'f'总是打算在相同类型的有序三元组上分配吗? – Shredderroy
OCaml的类型系统不支持特定长度的数组或由它们的长度参数化的同质元组。如果我们有这些,那么可以有一个单一的映射函数,类型为'('a - >'b) - >('a,)array - >('b,)array' –