F # list.fold максимум - PullRequest
       21

F # list.fold максимум

0 голосов
/ 27 ноября 2018

Я хотел использовать новую встроенную функцию (list.fold) в F #.У меня есть список с числами в нем, и я должен вернуть максимум.Если список пуст, он должен 0. Я попытался решить это следующим образом:

let max a b : Nat = if a > b then a else b
let maxofList = List.fold max
let maximum (xs: Nat list): Nat = maxofList xs 

Я не могу скомпилировать его, и я не знаю, как решить это по-другому, может быть, я просто недействительно не понимаю, как работают встроенные функции.Вход выглядит так:

maximum [12N; 4N; 67N; 5N] = 67N

1 Ответ

0 голосов
/ 27 ноября 2018

Как отмечается в комментариях, немного сбивает с толку, что вы используете тип Nat - это пользовательский тип, определенный где-то в используемой вами библиотеке, а не стандартный тип F #.Вы должны быть в состоянии заставить вещи работать с вашим типом Nat, но я просто упросту вещи и буду использовать целое число.

Теперь ваш код почти верен.Единственная проблема заключается в том, что List.fold принимает функцию для объединения текущего состояния со следующим элементом (это ваш max), но ему также необходимо начальное состояние.Это должно быть число, которое меньше всего в вашем списке.Если у вас просто положительные числа, вы можете использовать ноль:

let max a b : int = if a > b then a else b
let maxofList = List.fold max 0 // Added '0' as an extra parameter here!
let maximum (xs: int list): int = maxofList xs

В вашем случае это, вероятно, будет 0N.В качестве альтернативы вы можете использовать List.reduce, который принимает первый элемент списка в качестве начального значения и завершается неудачно, если список пуст:

let maxofList = List.reduce max
...