Что значит функции в SML имеют только один аргумент? - PullRequest
0 голосов
/ 21 февраля 2019

Итак, я прочитал, что каждая функция в SML имеет один аргумент и один результат.Но я видел такие примеры:

fun foo x y = x + y;
fun goo x y z = 5;

Эти примеры заставляют меня думать, что они получают более одного аргумента.Подписи:

val foo = fn : int -> int -> int
val goo = fn : 'a -> 'b -> 'c -> int

Единственное возможное объяснение, которое я могу придумать, это "синтаксический сахар", хотя я не уверен.Что может быть объяснением этому?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Там действительно присутствует синтаксический сахар.Если я правильно помню,

fun foo x y = x + y

- это просто синтаксический сахар для

val rec foo = fn x => (fn y => x + y)

Так что это определение фактически определяет функцию foo, которая принимает один аргумент x типаint и возвращает функцию типа int -> int.Таким образом, приложение функции foo 5 возвращает функцию:

fn y => 5 + y

Эта возвращенная функция, конечно, также может принимать аргумент.Это то, что выглядит как второй аргумент.Но обратите внимание, что этот аргумент не аргумент foo, а аргумент результата, который мы получаем при применении foo к его единственному аргументу.

0 голосов
/ 21 февраля 2019

Хотя ваши примеры, кажется, принимают несколько аргументов, на самом деле они принимают по одному аргументу за раз.

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 - это функция, которая удерживает элементы из коллекции, которые удовлетворяют данному предикату.

...