列表乘法

Tom*_*res 6 f#

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

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然后该函数连接所有这些生成的列表.


Mau*_*fer 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
Run Code Online (Sandbox Code Playgroud)

FSharpx有很多像这样的内置好东西.