列表乘法

时间:2011-11-24 17:26:45

标签: f#

是否有任何内置函数将列表的所有元素与另一个元素相乘?

let xList = [1..30]

let yList = [1..30]

会给:

[(1,1),(1,2),(1,3)..ect]

2 个答案:

答案 0 :(得分:13)

这被称为列表的跨产品或笛卡尔积。构造它的最简单方法是使用sequnce表达式 - 你可以简单地迭代这两个列表并产生所有对:

let prod = [ for x in xList do
               for y in yList do
                 yield x,y ]

如果您想使用高阶函数,则可以使用List.collect

xList |> List.collect (fun x -> 
    yList |> List.map (fun y -> x, y))

对于x中的每个值xList,lambda函数会生成一个新列表(例如[(x,1); (x,2); ... (x, n)])。然后List.collect函数连接所有这些生成的列表。

答案 1 :(得分:8)

我开始听起来像推销员:),但是 FSharpx有一个函数List.lift2来执行该操作(由函数参数化,类似于Haskell的liftM2)。

所以FSharpx就是let prod = List.lift2 tuple2 xList yList

tuple2是一个元组构造函数,也包含在FSharpx中)

编辑:为了以防万一,我想指出我并不是建议只为此依赖FSharpx ...当然你可以使用列表理解甚至只定义lift2和tuple2你自己,他们是微不足道的:

let inline lift2 f (l1: _ list) (l2: _ list) = 
    [ for i in l1 do
        for j in l2 do
            yield f i j ]

let inline tuple2 a b = a,b

FSharpx有很多内置的好东西。