是否有任何内置函数将列表的所有元素与另一个元素相乘?
即
let xList = [1..30]
let yList = [1..30]
会给:
[(1,1),(1,2),(1,3)..ect]
答案 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中)
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有很多内置的好东西。