2015-10-04 3 views
1

Как бы сгладить список списков целых чисел в один список целых чисел в ocaml? Функция будет работать, как показано ниже.Как сгладить список без рекурсии ocaml?

[[1;2];[3;4;5];[];[6]] -> [1;2;3;4;5;6] 

Поскольку это домашнее задание, это должно быть сделано с использованием только fold_left или fold_right, и не может использовать «@» оператора, и не может использовать рекурсию. Я понимаю, что аккумулятор будет членом нового списка, но я понятия не имею, как реально перемещать элементы исходного списка в накопитель. Любые намеки будут оценены.

ответ

2

Подсказка:

a. Перемещение значения в накопитель не сложно. Если ваше значение равно x, и ваш аккумулятор равен a, вы можете просто написать x :: a.

b. Вам в основном нужно обрабатывать все внутренние значения в последовательном порядке. Для этого нужны складки.

c. Сгиб предназначен для обработки элементов списка. Но у вас есть список списков.

0
List.fold_left (fun liRes la -> 
    List.fold_right (fun iRes la -> 
    iRes::la  
) liRes la 
) [] [[1;2];[3;4;5];[];[6]] 

результат:

- : int list = [1; 2; 3; 4; 5; 6] 

другая форма:

let (@) = 
    List.fold_right (fun iRes la -> 
    iRes::la 
);; 

List.fold_left (fun liRes la -> 
    liRes @ la 
) [] [[1;2];[3;4;5];[];[6]];; 

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

# []@[1;2];; 
- : int list = [1; 2] 
# (@) [1;2] [3;4];; 
- : int list = [1; 2; 3; 4] 
+2

(я не уверен, что это полезно в большой картине, чтобы дать код для чьей-либо проблемы с домашней работой.) –

+1

d некоторое объяснение к вашему коду! –

Смежные вопросы