是否有像List.zip
这样的内置函数将列表中的所有元素与另一个元素相乘?列表乘法
即
let xList = [1..30]
let yList = [1..30]
会给:
[(1,1),(1,2),(1,3)..ect]
是否有像List.zip
这样的内置函数将列表中的所有元素与另一个元素相乘?列表乘法
即
let xList = [1..30]
let yList = [1..30]
会给:
[(1,1),(1,2),(1,3)..ect]
这就是所谓的跨产品或列表的笛卡儿积。建造它的最简单的方法是使用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
函数连接所有这些生成的列表。
我开始听起来像一个推销员:),但 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有很多内置的一样好东西这个。