当前位置:  开发笔记 > 编程语言 > 正文

两个列表的交叉产品

如何解决《两个列表的交叉产品》经验,为你挑选了1个好方法。

乱用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

Tomas Petric.. 25

另一种选择是使用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 {...}中.



1> Tomas Petric..:

另一种选择是使用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 {...}中.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有