Концепция сгиба проста: вы выполняете функцию, называемую функцией folder
, по списку. При каждом вызове функция folder
получает элемент из списка и состояние и возвращает обновленное состояние.
Это очень похоже на ваш императивный код: вы перебираете список, получаете элемент из списка и старое значение переменной min
, и после каждой итерации вы получаете новое значение min
. Разница с императивным программированием заключается в том, что функция folder
не изменяет состояние, вместо этого она получает одно и возвращает другое, вы можете себе представить, если вам нравится, что List.fold
изменяет переменную внутри.
подпись сгиба:
List.fold :
folder: 'State -> 'T -> 'State ->
state : 'State ->
list : 'T list
-> 'State
первый параметр - это функция папки, второй - начальное состояние, а третий - список элементов. Результат будет последним состоянием.
Итак, ваша folder
функция должна выглядеть примерно так:
let folder min currData = ...
и ваша minimum
функция должна выглядеть следующим образом:
let minimum ls =
ls
|> List.fold folder initial
и вы называете это так:
minimum [ 5 ; 3 ; 8]
|> printfn "%A" // outputs: 3
Осталось несколько вопросов о том, как обращаться с начальным значением и что происходит, если список пуст. Но я оставлю это тебе.
Надеюсь, это поможет.