如何使用List.map实现List.allPairs



到目前为止,我已经制作了一个函数,它只匹配一个列表的所有元素和另一个列表中的第一个元素,但我需要它来匹配列表1的所有元素与列表2的所有元素。

到目前为止,我的代码如下:

let prototype (lst1: 'a list) (lst2: 'b list) =
List.map (fun i -> [i,lst2.Head]) lst1 |> List.concat

因此,您了解了如何将lst1的所有元素与单个元素配对。太棒了

现在看:在map的参数中,您有完全相同的问题——将lst2的每个元素与i配对。所以你可以用完全相同的方法来解决它:

let prototype (lst1: 'a list) (lst2: 'b list) =
List.map (fun i -> List.map (fun j -> [i, j]) lst2 |> List.concat) lst1 |> List.concat

但这当然有点难看。你可以做一些小的修改,使它更漂亮。

首先,注意List.map >> List.concat等价于List.collect:

let prototype (lst1: 'a list) (lst2: 'b list) =
List.collect (fun i -> List.collect (fun j -> [i, j]) lst2) lst1

当然,更好的选择是使用列表综合:

let prototype (lst1: 'a list) (lst2: 'b list) =
[ for i in lst1 do 
for j in lst2 ->
i, j
]

最新更新