Безопасность списка и дополнительных значений - PullRequest
0 голосов
/ 04 мая 2020

Может кто-нибудь сказать мне формальную причину, по которой списки / массивы и тому подобное считаются более безопасными, когда речь идет о пошаговых шагах, т. Е. (List.fold> loops).

Пример кода в F #

Функциональный способ (список)

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

1 Ответ

0 голосов
/ 04 мая 2020

Если под безопасностью вы подразумеваете «безопаснее» - тогда, я думаю, это чем-то объяснит. Для начала, если вы суммируете список, 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, однако, не обрабатывает пустой список, как это делает сгиб).

Короче говоря, он сохраняет программист не допускает ошибок в математике глупых индексов и постоянно сосредотачивает внимание на реальных логиках c того, что делается.

РЕДАКТИРОВАТЬ: я иронично испортил логики индекса c в своем первоначальном посте

...