有没有一种更为F#惯用的方法来创建两个序列的所有组合

有没有一种更为F#惯用的方法来创建两个序列的所有组合,f#,F#,我有以下代码: let orders = Array2D.init<AnalyzerOrder> (sentimentRanges |> Seq.length) (triggerRanges |> Seq.length) (fun x y -> AnalyzerOrder.empty) sentimentRanges |> Seq.iteri (fun x sentimentPeriod -> triggerRanges

我有以下代码:

    let orders = Array2D.init<AnalyzerOrder> (sentimentRanges |> Seq.length) (triggerRanges |> Seq.length) (fun x y -> AnalyzerOrder.empty)
    sentimentRanges |> Seq.iteri (fun x sentimentPeriod ->
        triggerRanges |> Seq.iteri (fun y triggerPeriod ->
            (
                let settings =
                    {
                        ...
                    }

                orders.[x, y] <- settings
            )
        )
    )
let orders=Array2D.init(triggerRanges |>Seq.length)(triggerRanges |>Seq.length)(fun x y->AnalyzerOrder.empty)
感伤范围>Seq.iteri(乐趣x感伤期->
triggerRanges |>Seq.iteri(有趣的triggerPeriod->
(
让设置=
{
...
}
订单。[x,y]一个例子:

let initArray f s1 s2 = Array2D.init (Array.length s1) (Array.length s2) (fun a b -> f s1.[a] s2.[b] )

initArray (+) [|1;2;3|] [|1;2;3;4|] //where f is a sum function in this case

如果只想列出所有组合,可以使用内置函数
Seq.allPairs
(也存在于
数组
列表
变体中)。如果你想创建一个二维数组,你应该按照@FRocha的建议去做。

当你查看
Seq.allPairs
时,你会发现它归结为外部循环的
Seq.collect
和内部循环的
Seq.cache
/
Seq.map
。这可以概括为两个函数ode>iterc
,他们将函数
f:('a->'b->'c)
或动作
f:('a->'b->unit)
作为第一个参数

let mapc f xs ys = Seq.collect (fun x -> Seq.map (f x) (Seq.cache ys)) xs
// val mapc : f:('a -> 'b -> 'c) -> xs:seq<'a> -> ys:seq<'b> -> seq<'c>

let iterc f xs ys = Seq.iter (fun x -> Seq.iter (f x) (Seq.cache ys)) xs
// val iterc : f:('a -> 'b -> unit) -> xs:seq<'a> -> ys:seq<'b> -> unit
mapc (*) (Seq.initInfinite (pown 10I)) [1I; 2I; 5I] |> Seq.take 10 |> Seq.toList
// val it : System.Numerics.BigInteger list =
//   [1; 2; 5; 10; 20; 50; 100; 200; 500; 1000]

let a2 = Array2D.zeroCreate 3 3
iterc (fun i j -> a2.[i,j] <- 1) [0..2] [0..2]