Хотя ваши примеры, кажется, принимают несколько аргументов, на самом деле они принимают по одному аргументу за раз.
foo 1
возвращает функцию, которая принимает y
в качестве аргумента, тогда когда вы применяете y
,функция оценивает.
goo 1
возвращает функцию, которая принимает y
, которая при получении возвращает функцию, которая принимает z
, что при получении позволяет функции оценивать.
Этопозволяет легко частично применять функцию, предоставляя ей меньше аргументов, чем требуется:
val f = foo 1 (* Returns a function *)
val returnVal = f 2 (* Both arguments were given, so the function is fully applied and evaluates *)
В сочетании с такими функциями, как map
или List.filter
, вы можете сделатьчитаемый код:
val keepNegatives = List.filter isNeg
keepNegatives [~1, ~2, 1, ~3]
> [~1, ~2, ~3]
Где isNeg
- это предикат, который проверяет, является ли число отрицательным, а List.filter
- это функция, которая удерживает элементы из коллекции, которые удовлетворяют данному предикату.