Может ли кто-нибудь сказать мне, почему? Или дать мне некоторый намек, чтобы заставить его работать?
Ответ 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