.net - 两个列表的叉积

标签 .net f#

搞乱 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/

相关文章:

c# - 从 DataTemplate 上的按钮获取 ListBox 行对象

c# - Entity Framework Designer 首先获取导航属性作为任务

f# - 在F#中实现约束数字类型的习语/实践?

f# - 为什么这个 F# 序列函数不是尾递归的?

F#存在哪里函数?

c# - 如何使用 Linq "NOT IN"

c# - .NET CultureInfo 本地化显示名称

c# - 显示滚动条时面板上的画线消失

list - F# Bool 列表检查列表中的 1 个元素是否为 true

oop - F# 对象构造函数