我想遍歷列表中的元素的所有組合,這些列表具有相同的長度但不一定是相同的類型。這就像兩個列表的笛卡爾積(這在OCaml中很容易做到),但對於任意數量的列表。OCaml中的列表的笛卡爾(外部)乘積
首先我試着編寫一個通用的笛卡爾(外)產品函數,該函數接受列表列表並返回元組列表,但由於列表的輸入列表不包含相同類型的元素。
現在我到類型
'a list * 'b list * 'c list -> ('a * 'b * 'c) list
的函數不幸固定的輸入的數目爲三(例如)。這是
let outer3 (l1, l2, l3) =
let open List in
l1 |> map (fun e1 ->
l2 |> map (fun e2 ->
l3 |> map (fun e3 ->
(e1,e2,e3))))
|> concat |> concat
這樣的工作,但它很麻煩,因爲它必須重做每個輸入數量。有一個更好的方法嗎?
背景:我想將生成的扁平列表提供給Parmap.pariter
。
我不確定你可以對任意類型執行此操作。類型多態性是一階的,即對於任何'a,'b,'c ...,同時你想要一個二階多態,即對於任何類型的'a1 ...'an集合。但是我的OCaml已經過時了。 – selig
嗯......據我所知,笛卡爾產品需要兩套,應該有類型''列表 - >'列表 - >('a *'b)列表。當然,就像任何其他產品一樣,你可以鏈接它們。 – ivg
好吧,可以從兩個輸入列表開始,並嘗試遞歸執行。然而,我不明白如何:如果我做了它,一旦我得到一個''a *'b列表'。現在我想再次做一次,用「c列表」鏈接。但是然後我得到了一個'(('a *'b)*'c)list'。現在的問題是如何以多態的方式拼合嵌套元組? – user3240588