Стандартный ML: вернуть разные типы - PullRequest
2 голосов
/ 02 сентября 2010

Мне нужно вернуть другое значение на основе функции, переданной в другую функцию.

Итак, учитывая: fun inc x = x + 1;

А: fun double [] = [] | double (h::t) = 2*h::double (t);

Вы должны быть в состоянии вызвать функцию, с которой я работаю, либо.

Пример вызова (выполняемая мной функция называется test):

test (inc, 5); - И он вернется 6

1018 * -ИЛИ- *

test (double, [1,2,3,4]); - И он вернется [2,4,6,8]

Я знаю, что функции не могут сделать это за чистую монету, но возможно ли это через слои абстракции?

1 Ответ

7 голосов
/ 03 сентября 2010

Конечно, это возможно:

fun test (f, x) = f x

test теперь имеет тип (('a -> 'b) * 'a) -> 'b, что означает, что если вы передадите функцию, которая возвращает int (например, inc), результатбудет int, и если вы передадите функцию, которая возвращает список, результатом будет список.

В качестве sidenote: double может быть проще / идиоматически определено как fun double xs = map (fn x -> x*2) xs или val double = map (fn x -> x*2).

...