пользовательская функция карты стандартная мл - PullRequest
0 голосов
/ 26 марта 2012

Я хочу создать пользовательскую функцию карты, которая будет выполнять ту же функцию, что и предопределенная функция карты в sml, я написал следующий код:

fun mymap f = fn L => foldr f [] L;

, которая в основном является функцией f, которая может затем приниматьсписок и применить функцию f к списку, так как функция карты берет список и функцию и возвращает другой список, теперь я получаю:

val mymap = fn : ('a * 'b list -> 'b list) -> 'a list -> 'b list

, но предопределенная функция карты имеет следующеевывод:

val it = fn : ('a -> 'b) -> 'a list -> 'b list

в чем проблема, которую я здесь сделал?Спасибо

ПРИМЕЧАНИЕ: я должен использовать функцию foldr или foldl и использовать карри

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Ну, вы должны понимать, что для каждого элемента списка, к которому вы применяете foldr, он берет элемент этого списка, предыдущий результат (или начальное значение) и передает оба функции, которые являются первым параметром.of foldr.

Это означает, что в написанном вами коде f принимает два параметра.Таким образом, f принимает значение списка ('a) и списка ('b list), и это дает нам тип:

'a * 'b list -> 'b list

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

1 голос
/ 26 марта 2012

В чем проблема?Итак, как вы можете видеть, проблема в том, что первый аргумент вашей функции (f) имеет неправильный тип, который будет использоваться в качестве первого аргумента для foldr.Сначала вы должны понять, какая функция требуется в качестве первого аргумента для foldr.

...