我确定这个问题是微不足道的,但是我无法一生解决。假设我有一个列表,并且想要获得列表的累积乘积:
> 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 int
。 int
是前面的1
。现在,当您访问List.scan上的Microsoft网页时,他们的示例似乎返回的元素数量完全相同。我看不到他们砍掉多余元素的地方。
现在,我可以简单地切掉开头的元素:
> li |> List.scan (fun acc value -> acc * value) 1 |> List.tail;;
val it : int list = [1; 2; 6; 24]
,我得到了我的结果列表。但是,我很困惑。该功能描述为
此函数采用第二个参数,并将其应用于列表的第一个元素。然后,它将结果与第二个元素一起传递给函数,依此类推。
对我来说,这将给我留下与原始文件大小相同的列表,对吗?我们如何获得额外的元素?
答案 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
。