Вы можете использовать сопоставление с образцом, чтобы проверить, является ли первый элемент в вашем списке четным, и, если это так, добавить его в список аккумуляторов и вызвать тот же метод в остальной части списка.Если элемент нечетный - просто вызовите тот же метод для остальной части списка, не добавляя ничего к аккумулятору.Когда список пуст - верните аккумулятор, и у вас будет список только четных чисел.
let rec getEven (input : int list) (acc: int list) =
match input with
| head :: tail when head % 2 = 0 -> (getEven tail (head :: acc))
| head :: tail when head % 2 = 1 -> (getEven tail (acc))
| _ -> acc
let even = getEven [1..10] []
let sum = List.sum even
Приведенная выше функция выдаст:
val getEven : input:int list -> acc:int list -> int list
val even : int list = [10; 8; 6; 4; 2]
val sum : int = 30
PS для вычисления суммы элементов, вы должны использовать List.sum
вместо List.length
, который вернет вам количество элементовв спискеТакже обратите внимание, что вы можете вычислять сумму четных элементов в функции getEven, сохраняя не список четных элементов, а их сумму.