gpt4 book ai didi

.net - 两个列表的叉积

转载 作者:行者123 更新时间:2023-12-03 15:19:59 24 4
gpt4 key购买 nike

搞乱 List 模块的“扩展功能”。
(我花了很长时间开发 'mapfold' - 它使用像 fold 这样的累加器,但使用它作为参数来创建像 map 这样的新值 - 然后发现这就是 List.scan_left 所做的)

为了生成测试数据,我需要做两个列表的叉积,这就是我想出的:

///Perform cross product of two lists, return tuple
let crossproduct l1 l2 =
let product lst v2 = List.map (fun v1 -> (v1, v2)) lst
List.map_concat (product l1) l2

这有什么好处,还是已经有更好的方法来做到这一点?

同样的问题:
///Perform cross product of three lists, return tuple
let crossproduct3 l1 l2 l3 =
let tuplelist = crossproduct l1 l2 //not sure this is the best way...
let product3 lst2 v3 = List.map (fun (v1, v2) -> (v1, v2, v3)) lst2
List.map_concat (product3 tuplelist) l3

最佳答案

另一种选择是使用 F#“序列表达式”并编写如下内容:

let crossproduct l1 l2 =
seq { for el1 in l1 do
for el2 in l2 do
yield el1, el2 };;

(其实和你写的差不多,因为'for .. in .. do'在序列表达式中可以看成map_concat)。这适用于(惰性)序列,但如果您想使用列表,您只需将代码包装在 [ ... ] 中而不是 seq { ... } 中。

关于.net - 两个列表的叉积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/482866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com