Попытка анонимной функции в SML

У меня есть функция ниже, и она работает:

(fn x => x * 2) 2; 

но этот не работает:

(fn x y => x + y ) 2 3;

Может ли кто-нибудь сказать мне, почему? Или дать мне некоторый намек, чтобы заставить его работать?

Ответы

Ответ 1

(fn x => fn y => x+y) 2 3; работает. fn просто не имеет одного и того же синтаксического сахара для определения точных функций, которые fun имеет.

Ответ 2

В стандартном ML функция может иметь только один аргумент, поэтому используйте

(fn (x,y) => x + y) (2,3) 

и тип

fn: int * int -> int

за это время (x, y) и (2,3) - структура списка,

Ответ 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