我有以下功能,它做我想要的.但是使用concat(@)运算符,它是O(n)而不是O(1)运算符
let myFunc s m cs =
let n = s * m
let c = [n - s] // single element list
(n, cs @ c) // concat the new value to the accumulated list
let chgLstAndLast =
[0.99; 0.98; 1.02]
|> List.fold (fun (s, cs) m -> myFunc s m cs) (1., [])
chgLstAndLast返回最后生成的结果值和列表:
val chgLstAndLast : float * float list = (0.989604, [-0.01; -0.0198; 0.019404])
我想以三种方式改进上述内容.
>使用con(::)而不是concat(@)
>将列表累积从myFunc移动到List.fold操作
>确保结果列表顺序保持与上面相同(即最后结果位于列表末尾而不是头部)
例如,我想写一个像这样的myFunc
let myFunc s m cs =
let n = s * m
let c = n - s // single element, but not as list
(n, c) // No concat here
但是当我这样做时,我没有看到如何在折叠功能中使用(::)缺点.