谁能告诉我形式上的原因,为什么当涉及到增量步骤即(List.fold >循环)时,listarrays等被认为更安全。
F#中的Exampel代码
功能方式(列表
let rec sum lst =
match lst with
| [] -> 0
| x::xs -> x + sum xs
强制性方式(渐进式)
let sum n m =
let mutable s = 0
for i=n to m do
s <- s + i
s
如果你所说的安全性是指 "更安全"--那么我想这个可以解释一些。首先如果你要对一个列表进行求和,一个 fold
应该是比较安全的,因为它消除了程序员正确索引列表的需要。
let sum lst =
let mutable s = 0
for i=0 to (List.length lst - 1) do
s <- s + lst.[i]
s
通过使用库函数,你完全避免了很多陷阱。
let sum lst =
let folder acc element =
acc + element
List.fold folder 0 lst
折叠函数为你处理了所有的边缘情况,在索引和列表长度方面。(注意:这也可以通过使用 List.reduce (+) lst
然而,这 不 处理一个空列表,而折叠则是)。)
简而言之,就是让程序员不在愚蠢的索引数学上犯错,把注意力放在实际的逻辑上。
EDIT:我在最初的帖子中讽刺性地把索引逻辑搞乱了