Решение, о котором я только что подумал, следующее:
fun addGt(k, xs) = List.foldl (fn (x, y) => if x >= 5 then x + y else y) 0 xs;
Но позвольте мне объяснить. Прежде всего, проверьте тип функции List.foldl
, это:
('a * 'b -> 'b) -> 'b -> 'a list -> 'b
Итак, List.foldl
- это функция curry , которая принимает в качестве первого параметра другую функцию типа ('a * 'b -> 'b)
. Вы использовали (fn x => if x > k then op+ else 0)
, который имеет тип int -> int
. Вместо этого вы должны предоставить List.foldl
функцию, которая принимает кортеж типа int * int
и возвращает int
, так что-то вроде этого: (fn (x, y) => do stuff)
. Вот почему ваш код не компилировался, вы передали неверный тип функции в foldl
.
Теперь вы можете думать о foldl
так:
foldl f b [x_1, x_2, ..., x_(n - 1), x_n] = f(x_n, f(x_(n - 1), ..., f(x2, f(x1, b)) ...))
, где f
- функция типа ('a * 'b -> 'b)
, b
- что-то типа 'b
, а список [x_1, x_2, ..., x_(n - 1), x_n]
- 'a list
.
И похоже на foldr
, вы можете думать так:
foldr f b [x_1, x_2, ..., x_(n - 1), x_n] = f(x_1, f(x_2, ..., f(x_(n - 1), f(x_ n, b))