Если убрать синтаксический сахар из ваших двух определений они становятся:
val add = fn x => fn y => x+y
и
val add = fn xy =>
case xy of
(x,y) => x+y
Таким образом, в первом случае add
это функция, которая принимает аргумент x
и возвращает другую функцию , который принимает аргумент y
, а затем возвращает x+y
. Этот метод моделирования нескольких аргументов путем возврата другой функции известен как currying.
Во втором случае add
- это функция, которая берет кортеж в качестве аргумента, а затем добавляет два элемента кортежа.
Это также объясняет два разных типа. ->
- это функция, которая ассоциируется справа, то есть int -> int -> int
- это то же самое, что и int -> (int -> int)
, описывающее функцию, которая принимает int
и возвращает функцию int -> int
.
*
с другой стороны, синтаксис, используемым для типов кортежей, то есть int * int
является тип кортежей, содержащих два целых, так int * int -> int
(который Скобки, как (int * int) -> int
, потому что *
имеет более высокий приоритет, чем ->
) описывает функцию, которая принимает кортеж из двух int и возвращает int.
В случае int -> int -> int, это из-за currying, где add сначала принимает один int, возвращает другую функцию, которая принимает другой int и возвращает final int? –
https://courses.cs.washington.edu/courses/cse341/09au/notes/notes07.html –