OCaml地图上的元组

时间:2015-12-13 23:24:31

标签: ocaml

我的代码中有几个地方看起来像这样:

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

如果我可以写下这样的话会很好:

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

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

2 个答案:

答案 0 :(得分:5)

最佳答案是,如果您希望它适用于不同大小的元组,则无法执行此操作。每个元组大小在OCaml中是不同的类型。所以没有OCaml类型代表"任何大小的元组都是字符串的元组。"

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

答案 1 :(得分: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,这个类型在元组的长度上是多态的,但除非优势很大,否则最好避免使用这种技巧。这似乎不是这样的。