2014-10-08 2 views
1

Я пытался понять функции более высокого порядка в SML. Я знаю, как писать простые функции более высокого порядка, а также понимать подпись. Одним из примеров является:Подпись функций более высокого порядка в SML

fun increment list = map (fn x=> x + 1) list; 
val it = fn: int list -> int list 

Однако, я не могу понять, подпись ниже функций высшего порядка:

fun add x y = x + y; 
val add = fn: int -> int -> int 

функция может быть записана как:

fun add (x,y) = x+y; 
val add: fn : (int * int) -> int 

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

Мне нужно построить концепцию о подписи функций более высокого порядка для моей домашней работы, а также моих экзаменов, которые появятся через несколько недель.

ответ

1

В SML функции могут быть в карри.

- fun add x y = x + y 
    val add = fn : int -> int -> int 

is curried. Это означает, что он может быть частично применен, например:

- fun add2 x = add 2 x; 
    val add2 = fn: int -> int 
    - add2 3; 
    val it = 5 : int 

Если мы напишем функцию, как:

- fun add2tuple(x,y) = x + y; 
    val add2tuple = fn : (int * int) -> int 

Мы на самом деле не проходящее по двум параметрам, но один кортеж. То, что кортеж содержит два целых числа, является описанием типа кортежа.

  • Если мы напишем функцию в картонной форме, то параметры функции не помещаются в кортеж.

  • В кардной форме функция fun f p1 p2 ... pn = ... может быть частично применена путем прохождения от 1 до n-1 аргументов.

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

- fun addordered x y = x + (2 * y); 
val addordered = fn : int -> int -> int 
- addordered 2 3; 
val it = 8 : int 
- fun addordered2 x = addordered x 2; 
val addordered2 = fn : int -> int 
- addordered2 3; 
val it = 7 : int 

Этот пример может пояснить, что кортеж одну вещь:

- fun add3tuple(x,y,z) = x + y; 
val add3tuple = fn : int * int * 'a -> int 
- add3tuple(3,4,5); 
val it = 7 : int 
- add3tuple(3,4,"Hello World"); 
val it = 7 : int 

Надеюсь, вам понравится класс Дэна Гроссмана.

1

Следует иметь в виду, что все Функции SML принимают ровно один аргумент. Этот аргумент может представлять собой пару, как в вашей второй функции add, или int, как в вашей первой функции add. Вы правы, что первый add возвращает функцию типа int -> int. Вы также могли бы написать

fun add1 x = fn y => x + y 

, что делает его более понятным, если требуется один аргумент. Или даже

val add1 = fn x => fn y => x + y 

(FWIW, ваша double функция выглядит немного странно. Она игнорирует свой аргумент и возвращает тот же результат каждый раз.

fun increment list = map (fn x => x + 1) list 

, вероятно, что вы имели в виду.)

+0

Да, например, когда вы вызываете 'add 2', вы должны думать об этом как о возврате функции' (fn y => 2 + y) ', которая получается просто путем замены всех вхождений' x' со значением '2'. – RasmusWL

 Смежные вопросы

  • Нет связанных вопросов^_^