2010-06-19 1 views
2

есть ли способ перечислить список через список через List.map?ocaml с помощью List.map итерации по списку

Я знаю, что List.map использует одну функцию и список и создает список, который функция применима ко всем элементам. Но что, если у меня есть список функций для применения списка и создания списка списка?

+0

Вы принимаете CS421, не так ли? –

ответ

6

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

(* // To get one nested list (of results of all functions) for each element *) 
List.map (fun element -> 
    List.map (fun f -> f element) functions) inputs 

(* // To get one nested list (of results for all elements) for each function *) 
List.map (fun f -> 
    List.map (fun element -> f element) inputs) functions 

В случае, если это не то, что вы хотите, вы могли бы попытаться уточняющий вопрос немного (возможно, какой-то конкретный пример поможет)?

+0

Я думаю, что у вас есть идея, функция принимает список функций и список значений и применяет каждую функцию ко всем значениям. Результат - результат каждой функции для всех значений. Ex) [(...); (...); (...)] список функций и [1; 2; 3; 4] список значений, тогда результат будет [[true, true, false false]; [false, true, true, true]; [...]; [...]] – REALFREE

+0

Я думал, что это вопрос Ocaml, а не F # one? Я не думаю, что OCaml имеет оператор |>. – sashang

+0

@sashang: Спасибо за исправление - я не был уверен, что у OCaml есть этот оператор (но я думал, что он так полезен, поэтому он тоже должен иметь это - ошибка!). Остальная часть ответа должна быть правильной. –

0

Вы можете попробовать это:

let rec fmap fct_list list = match fct_list with 
    [] -> //you do nothing or raise sth 
    head::tail -> List.map head list :: fmap tail list;; 
+0

Я уже знал, как это сделать с рекурсивной функцией. Но трюк заключается в том, что я не могу использовать рекурсивную функцию напрямую, но через List.map – REALFREE

+1

Обратите внимание, что // не является законным способом прокомментировать код в OCaml – sashang

+0

Я не думаю это возможно только с List.map. Возможно, вам придется использовать с ним другие функции, такие как List.iter или List.fold_left или fold_right и т. Д. – Dimitri

0

Вы разрешили использовать List.map2? Потому что тогда это просто:

let lista = [(fun x -> x + 1); (fun x -> x + 2); (fun x -> x + 3)];; 
let listb = [1; 1; 1];; 
let listc = List.map2 (fun a b -> (a b)) lista listb;; 

Выход будет [2; 3; 4]

Редактировать: подождите, я думаю, что неправильно прочитал вашу проблему. Вы хотите получить список списков, где каждый список содержит список функций, применяемых к исходному списку? Другими словами, для списка и списка выше, вы получите:

[[2;2;2];[3;3;3];[4;4;4]] 

Это правильно?

+0

Я не знал, что есть list.map2 но я должен использовать несколько list.map и вложил его в цикл по списку, но все равно потерял – REALFREE

+0

. Это решение только применяет каждую функцию к одному элементу, и для каждого элемента должна быть одна функция. – Thelema

+0

Да, это мое редактирование. Проблема была сформулирована плохо и может быть истолкована несколькими различными способами. Я понял, что моя первоначальная интерпретация неверна, но я все еще не совсем понимаю, что на самом деле спрашивается. –