Как рассчитать индивидуальный список в списке списков - PullRequest
1 голос
/ 08 апреля 2020

У меня очень простой вопрос, как выполнить операцию сложения для каждого из списков в списке списков, содержащих целые числа.

Итак, если бы я назвал эту функцию следующим образом:

add [[1;5] ; [4;3;7]];;

... он должен вернуть это:

-: int list = [6;14]

Я думал об этом коде, но он точно не работает ...

let rec add list = match list with
            | [] -> []
            | hd::tl -> (List.map(fun x -> x + List.hd) hd)::add(tl);;

Но этот, однако, делает:

 let rec add list =
     if (list = []) then []
       else (List.map(fun x -> x+x) (List.hd list))::add(List.tl list);;


  add [[1;3];[5;7]];;

... но он выполняет операцию сложения только над одним целым числом в списке списков с тем же самым целым числом, и да, я знаю почему; потому что я поставил: fun x -> x + x ... но разве функция map не должна также вычислять целые числа в списках вместе?
Я говорю это, потому что я использовал это в хвосте рекурсивный способ с помощью :: add (tl list) Кстати, это не работает должным образом, даже если я использую сопоставление с образцом ...

Итак, чтобы подвести итог, я требую, чтобы функция дала мне эти выходные данные:

-: int list = [6;14]

... с таким входным сигналом: add [[1; 5]; [4; 3; 7]] ;;

Может кто-нибудь помочь? Буду очень признателен!

1 Ответ

3 голосов
/ 08 апреля 2020

Существует две базовые операции c над контейнерами: складывание (сокращение) и отображение. Операция свертывания берет список и применяет некоторые операции к своим последовательным элементам. Операция map перестраивает список, применяя одну и ту же операцию ко всем его элементам.

      fold     vs.    map
 x x x x x x x    x x x x x x x
      | |             | |                           
      \ /             \ /
       y          y y y y y y y

Для вашей задачи мы можем применить эти операции вместе, то есть сложить внутренние списки и отобразить внешние, что можно очень кратко выразить в OCaml:

let sums = List.map (List.fold_left (+) 0)

Как В упражнении я бы предложил реализовать ту же функцию без использования стандартных операций из модуля List.

...