如何使用List.map实现List.allPairs?
实现两个列表元素的全配对(笛卡尔积)
原代码的问题在于固定取了lst2的第一个元素(lst2.Head),要实现list1所有元素和list2所有元素逐一配对,只需要把对单个元素的配对逻辑改成遍历lst2的所有元素即可:
let fullPair (lst1: 'a list) (lst2: 'b list) = lst1 |> List.map (fun i -> lst2 |> List.map (fun j -> (i, j))) |> List.concat
代码说明:
- 外层
List.map遍历lst1的每个元素i - 内层
List.map遍历lst2的每个元素j,将i和j组成元组(i,j) - 最后用
List.concat把所有内层生成的小列表合并成一个大列表,得到所有元素的配对组合
另外,也可以用F#的列表推导式来简化写法,逻辑更直观:
let fullPair (lst1: 'a list) (lst2: 'b list) = [ for i in lst1 do for j in lst2 do yield (i, j) ]
这两种写法都能生成两个列表的笛卡尔积,也就是所有元素的逐一配对结果。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

