2014-11-20 3 views
0

Функция List.map имеет такой тип:Что тип List.map List.map

# List.map;; 
- : ('a -> 'b) -> 'a list -> 'b list = <fun> 

и может быть использован его таким простым способом:

# List.map square [1;2;3;4];; 
- : int list = [1; 4; 9; 16] 

Мой вопрос:

Каков тип этой функции и пример использования?

# let superMap = List.map List.map;; 
val superMap : ('_a -> '_b) list -> ('_a list -> '_b list) list = <fun> 

Заранее спасибо

+0

Это функция, которая принимает список функций: –

+0

Это функция, которая принимает в качестве аргумента список функций: (List.map List.map) [(fun x -> x + 1)] ;;. Сказав это, я пока не в состоянии его использовать. –

+0

Проверьте этот вопрос и его ответ для объяснения значения подчеркивания в параметрах типа: http://stackoverflow.com/questions/4242677/what-is-the-difference-between-a-and-l – didierc

ответ

2

Вот пример:

let f_list = (List.map List.map) [(fun x -> x+1);(fun x -> 2*x)];; 
val f_list : (int list -> int list) list = [<fun>; <fun>] 

Так оно принимает список функций в качестве входных данных и возвращает список функций, работающих со списками.

List.map (fun f -> f [1;2;3]) f_list;; 
- : int list list = [[2; 3; 4]; [2; 4; 6]] 

Так что она делает: она работает каждый из простой функции, перечисленные в начале на каждом из элементов в списке Int.

... но какая странная функция!

+0

Good ответ :-) – daniele3004

1

Это еще один способ, в котором вы могли бы определить тип: Предположим, что карты типов (Haskell нотации)

map :: (a -> b) -> [a] -> [b] 
map2 :: (c -> d) -> [c] -> [d] 

вы можете выследить результат, заменяя переменные типа. В случае отображения карты 2 можно сделать замену: объединение с (c -> d) и b объединяется с остальными [c] -> [d]. Подставляя эти переменные в типе карт (и оттравливание первого аргумента карты (который map2)) получаешь вам следующий вид:

map map2 :: [c -> d] -> [[c] -> [d]] 
Смежные вопросы