我试图做一个“展开” - (我认为),从一个初始值开始,重复应用一些函数,然后得到一个序列作为结果。
在这个例子中,我试图从1.0开始,将它乘以.80,并做4次,这样我最终得到一个数组= [| 1.0; 0.80; 0.64; 0.512 |]
VS 2010说我以无效的方式使用“i”,并且闭包不能捕获可变值 - 所以这个函数不能编译。任何人都可以建议一个真正有效的干净方法吗?谢谢。
let expSeries seed fade n =
//take see and repeatedly multiply it by the fade factor n times...
let mutable i = 0;
let mutable weight = seed;
[| while(i < n) do
yield weight;
weight <- weight * fade |]
let testWeights = expSeries 1.0 0.80 4
答案 0 :(得分:7)
let exp_series seed fade n =
Array.init (n) (fun i -> seed * fade ** (float i))
答案 1 :(得分:2)
我认为这个递归版本应该可行。
let expSeries seed fade n =
let rec buildSeq i weight = seq {
if i < n then
yield weight;
yield! buildSeq (i + 1) (weight * fade)
}
buildSeq 0 seed
|> Seq.toArray
答案 2 :(得分:2)
根据anwer to this question,您可以创建展开,并获取其中的一些值:
let weighed startvalue factor =
startvalue |> Seq.unfold (fun x -> Some (x, factor * x))
let fivevalues = weighed 1.0 .8 |> Seq.take 5
答案 3 :(得分:1)
如果您想明确使用展开,请按以下方式进行:
let expSeries seed fade n =
Seq.unfold
(fun (weight,k) ->
if k > n then None
else Some(weight,(weight*fade, k+1)))
(seed,1)
|> Array.ofSeq
let arr = expSeries 1.0 0.80 4
请注意,原始代码无法工作的原因是闭包不能捕获可变绑定,而序列,列表和数组表达式隐式使用闭包。