Ответ 1
(fn x => fn y => x+y) 2 3;
работает. fn
просто не имеет одного и того же синтаксического сахара для определения точных функций, которые fun
имеет.
У меня есть функция ниже, и она работает:
(fn x => x * 2) 2;
но этот не работает:
(fn x y => x + y ) 2 3;
Может ли кто-нибудь сказать мне, почему? Или дать мне некоторый намек, чтобы заставить его работать?
(fn x => fn y => x+y) 2 3;
работает. fn
просто не имеет одного и того же синтаксического сахара для определения точных функций, которые fun
имеет.
В стандартном ML функция может иметь только один аргумент, поэтому используйте
(fn (x,y) => x + y) (2,3)
и тип
fn: int * int -> int
за это время (x, y) и (2,3) - структура списка,
Ответы, приведенные выше, верны. Функции SML принимают только один аргумент. В результате функции SML могут иметь только один из двух типов ввода:
1) t = (t1 * t2 * ... * tN)
, для некоторого N
2) t = a
, для некоторого a
.
Таким образом, технически говоря, SML принимает только типы товаров или унарные типы в качестве аргументов для функций. В общем случае можно думать об этом как о унитарном типе или о проекции некоторого типа продукта.
Чтобы иметь currying внутри анонимных функций, не стесняйтесь вставлять их друг в друга, как:
fn x1 => fn x2 => ... fn xN => ...
Я думаю, что также важно знать, что:
fun a = fn x1 => fn x2 => ... fn xN => ...
- полное расширение синтаксического сахара: fun a x1 x2 .. xN