2015-12-13 38 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)'。如果你只有幾個尺寸,這可能是一個體面的解決方案。 –