列表与增量值安全

问题描述 投票:0回答:1

谁能告诉我形式上的原因,为什么当涉及到增量步骤即(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
security f#
1个回答
0
投票

如果你所说的安全性是指 "更安全"--那么我想这个可以解释一些。首先如果你要对一个列表进行求和,一个 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:我在最初的帖子中讽刺性地把索引逻辑搞乱了

© www.soinside.com 2019 - 2024. All rights reserved.