我试图使用常量和两个数组减去n-1元素作为计算的一部分,如下所示:
module SOQN =
open System
let firstArray = [|0.02;0.03;0.05;0.07;0.11|]
let secondArray = [|0.30;0.50;0.70;1.10;1.30|]
let constant = 0.37
let minusOneElement = 0.00
let result = Array.map2 (fun x y -> (x - (constant * (y - minusOneElement)))) firstArray secondArray
printfn "Result: %A" result
(*
Expected Result: [|-0.091;-0.044;-0.024;0;0|]
Actual Result: [|-0.091;-0.155;-0.209;-0.337;-0.371|]
*)
正如你所看到的,第一个输出值是正确的,但其余部分没有给出我不知道如何构造" minusOneElement",这应该是" secondArray&#34的连续元素; - 即0.30 0.50 0.70和1.10。还有一个额外的限制是" secondArray"少于一个;否则,相应的结果值设置为零。
答案 0 :(得分:2)
如果我正确地解释了您的要求,您希望获取第二个数组并生成对(当前元素,前一个元素),其中前一个元素对于第一个当前元素设置为0.0。
您可以使用Seq.windowed生成对(在为前一个元素添加0.0的单例数组之后):
let fst = [|0.02;0.03;0.05;0.07;0.11|]
let snd = [|0.30;0.50;0.70;1.10;1.30|]
let snd' = Seq.windowed 2 (Array.append [|0.0|] snd) |> Seq.toArray
let constant = 0.37
修改地图操作:
let result = Array.map2 (fun x (y: float []) -> (if y.[1] < 1.00 then (x - (constant * (y.[1] - y.[0]))) else 0.00)) fst snd'
这会产生您的预期结果(请注意snd&#39;对以供参考):
val snd' : float [] [] =
[|[|0.0; 0.3|]; [|0.3; 0.5|]; [|0.5; 0.7|]; [|0.7; 1.1|]; [|1.1; 1.3|]|]
val result : float [] = [|-0.091; -0.044; -0.024; 0.0; 0.0|]
答案 1 :(得分:1)
以下代码段似乎有效:
if let location = record["location"] as? CLLocation {
annotation.coordinate = location.coordinate
}
如果可能的话,我会很感激一种更惯用的解决方案。
答案 2 :(得分:1)
对于每个int(Twice, int)
,构造一个元组及其与y.[n]
的区别。实现此功能的方法是y.[n-1]
操作,该操作使用scan
的中间结果填充集合。与fold
(或者就此而言,Seq.windowed
)相比,生成的集合的长度不小于源。它包含一个额外的元素,初始状态是前置的。
Seq.pairwise