是否有像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有很多內置的一樣好東西這個。