Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 使用array.fold(以F为单位)的累积和#_F# - Fatal编程技术网

F# 使用array.fold(以F为单位)的累积和#

F# 使用array.fold(以F为单位)的累积和#,f#,F#,我有一个以下类型的数组 let myarray = [| 1 .. 5 |] 我想得到另一个数组,其中每个元素都是前面元素的累积和: let mycumarray = [| 1 3 6.. 15 |] 我想做的是: let sumArray array = Array.fold (fun acc elem -> acc + elem) 0.0 array let mycumarray = sumArray myarray 但是,它不起作用。有人对获取累积值有什么建议吗?我想您正在寻找

我有一个以下类型的数组

let myarray = [| 1 .. 5 |]
我想得到另一个数组,其中每个元素都是前面元素的累积和:

let mycumarray = [| 1 3 6.. 15 |]
我想做的是:

let sumArray array = Array.fold (fun acc elem -> acc + elem) 0.0 array
let mycumarray = sumArray myarray

但是,它不起作用。有人对获取累积值有什么建议吗?

我想您正在寻找的是
数组。scan
,它非常类似于
数组。fold
,但返回所有状态值,而不仅仅是最后一个:

(Array.scan (+) 0 myArray).[1..]

[1..]
是数组切片器符号(),用于删除第一个元素,这是必要的,因为
扫描
在输出中包含初始状态。

数组。扫描
肯定是最佳解决方案,但如果您希望这样,可以使用
折叠

let cumList xs = 
    List.ofSeq xs 
    |> List.fold (fun (acc, ys) elem -> 
                      let acc' = acc + elem 
                      in (acc', ys @ [acc'])) 
       (0, []) 
    |> snd 
    |> List.toArray
以下是您的示例:

> cumList [|1..5|];;                                                                                                                               
val it : int [] = [|1; 3; 6; 10; 15|]
请注意,
@
不是最佳的,但它很好地显示了所做的事情(如果性能很重要,您可以使用
列表。折叠
或执行
::
,然后使用最终的
列表.rev
,以获得正确的顺序

您还可以使用
数组。直接附加
,而不是
@

使示例在数字上通用: 您只需将函数
内联
,并使用
GenericZero
而不是
0
(假定为
int

顺便说一句:这也适用于
数组。扫描方法:

let inline cumList2 xs =
    Array.scan (+) LanguagePrimitives.GenericOne xs

备注如果您只是从
1
开始而不是从
0

开始而不是从0开始,则在这种情况下不需要数组切片。可以获取数组的第一个元素:array.scan(+)myArray。[0]但是需要知道数组不是empty@FoggyFinder这不会产生正确的结果,因为第一个条目添加了两次。它可能是
Array.scan(+)myArray。[0]myArray。[1..]
。无论如何,使用
[1..]的任何版本
切片器将在空数组上出现
索引自动失效异常
,因此应检查是否可能出现这种情况。哦,当然。我很匆忙。感谢您更正了我的回答卡斯滕,谢谢您的回答。如果我的列表是浮动的,我将如何编辑上述代码:cumList[| 1.0..5.0 |]?您只需将
(0,[])
更改为
(0.0,[])
,或者您可以将其用于数字-我将添加此项
let inline cumList2 xs =
    Array.scan (+) LanguagePrimitives.GenericOne xs