是否有任何内置函数将列表的所有元素与另一个元素相乘?
即
let xList = [1..30]
let yList = [1..30]
Run Code Online (Sandbox Code Playgroud)
会给:
[(1,1),(1,2),(1,3)..ect]
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 13
这被称为列表的交叉产品或笛卡尔积.构造它的最简单方法是使用sequnce表达式 - 您可以简单地遍历两个列表并产生所有对:
let prod = [ for x in xList do
for y in yList do
yield x,y ]
Run Code Online (Sandbox Code Playgroud)
如果要使用高阶函数,则可以使用List.collect:
xList |> List.collect (fun x ->
yList |> List.map (fun y -> x, y))
Run Code Online (Sandbox Code Playgroud)
对于x来自的每个值xList,lambda函数生成一个新列表(例如[(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
Run Code Online (Sandbox Code Playgroud)
FSharpx有很多像这样的内置好东西.