2011-11-24 72 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有很多內置的一樣好東西這個。