有没有一种更为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]