Стандартен ML: Връща различни типове

Трябва да върна различна стойност въз основа на функцията, предадена на друга функция.

И така, като се има предвид: fun inc x = x + 1;

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

Трябва да можете да извикате функцията, върху която работя.

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

test (inc, 5); - И ще върне 6

-OR-

test (double, [1,2,3,4]); - И ще върне [2,4,6,8]

Знам, че функциите не могат да направят това по номинална стойност, но възможно ли е това чрез слоеве на абстракция?


person Ryan    schedule 02.09.2010    source източник
comment
Дори и да има начин - ако това е отговорът, вие вероятно задавате грешен въпрос. Защо мислите, че имате нужда от него и защо не можете да използвате map и списъци с единични елементи?   -  person    schedule 02.09.2010
comment
Това имах предвид, когато казах „абстракция“. Използването на map беше първото ми предположение, просто не можах да разбера как да го направя.   -  person Ryan    schedule 03.09.2010


Отговори (1)


Разбира се, това е възможно:

fun test (f, x) = f x

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

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

person sepp2k    schedule 02.09.2010