到目前为止,我已经制作了一个函数,它只匹配一个列表的所有元素和另一个列表中的第一个元素,但我需要它来匹配列表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
]