2011-11-24 81 views
4

是否有像List.zip这样的内置函数将列表中的所有元素与另一个元素相乘?列表乘法

let xList = [1..30] 

let yList = [1..30] 

会给:

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

回答

12

这就是所谓的跨产品或列表的笛卡儿积。建造它的最简单的方法是使用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)) 

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

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有很多内置的一样好东西这个。