为什么List.scan会在列表的开头附加一个值?

时间:2018-10-11 03:45:58

标签: f#

我确定这个问题是微不足道的,但是我无法一生解决。假设我有一个列表,并且想要获得列表的累积乘积:

> let li = [1; 2; 3; 4;];;
  val li : int list = [1; 2; 3; 4]

我可以使用List.scan来做到这一点:

> li |> List.scan (fun acc value -> acc * value) 1;;
  val it : int list = [1; 1; 2; 6; 24]

请注意,结果正好长1 intint是前面的1。现在,当您访问List.scan上的Microsoft网页时,他们的示例似乎返回的元素数量完全相同。我看不到他们砍掉多余元素的地方。

现在,我可以简单地切掉开头的元素:

> li |> List.scan (fun acc value -> acc * value) 1 |> List.tail;;
  val it : int list = [1; 2; 6; 24]

,我得到了我的结果列表。但是,我很困惑。该功能描述为

  

此函数采用第二个参数,并将其应用于列表的第一个元素。然后,它将结果与第二个元素一起传递给函数,依此类推。

对我来说,这将给我留下与原始文件大小相同的列表,对吗?我们如何获得额外的元素?

2 个答案:

答案 0 :(得分:1)

说明如下:

  

最后,它返回中间结果列表和最终结果。

“和”表示它返回一个额外的元素。如果它提到返回初始状态和结果结果列表,也许会更清楚。

无论哪种方式,它似乎都是该功能的一个功能。如果不需要额外的值,则List.tail将其砍掉。

答案 1 :(得分:0)

List.scan上的网页给出了一个示例,其中transactions有6个元素,而balances = [1122.73 ... 1257.31]有7个元素。 (为正确计费,代码应为printfn "$%10.2f $%10.2f" transactions.[i] balances.[i]。)

List.scan f s l的输出满足:

o.[0] = s
o.[i] = f(o.[i-1],l.[i-1])

这为o[i]定义了i in 0 .. l.Length。因此o.Length自然就是l.Length+1