Соответствие arithemti c операциям со списком списков в OCaml - PullRequest
0 голосов
/ 10 апреля 2020

Я столкнулся с проблемой в OCaml, где мне нужно выполнить арифметические c операции со списком списков. В качестве параметров я передаю список списков, например [[1;2;3]; [4;5;6]];, и список символов, подобных этому ['+'; '*'; '-'].

Это то, что у меня так далеко:

let addition = List.map (List.fold_left ( + ) 0);;
let multiplication = List.map (List.fold_left ( * ) 0);;
let subtraction = List.map (List.fold_left ( - ) 0);;

let list = [[1;2;3]; [4;5;6]; [7;8;9]];;
let operators = ['+'; '*'; '-'];;

let rec rows l o =
  match (l, o) with
    ([], []) -> []
    (hd::tl, op::tlo) ->
      (
        match hd with
          [] -> 0::(rows tl tlo)
          h::t ->

Это недостающая часть, я не знаю, как сопоставить первый оператор с первым списком в списке списков, второй оператор со вторым списком списков и т. Д. И выполнить операцию над элементами в list.

Я пытался использовать от List.iter до go через каждого оператора, но я запутался в том, как сопоставить позиции в списке операторов со списком списков.

С учитывая список списков и заданные операторы, результат должен быть [6; 120; -10].

Я совершенно новичок в OCaml, извините, если я что-то упустил очень очевидное, любая помощь очень ценится.

1 Ответ

0 голосов
/ 10 апреля 2020

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

 let rec map2 f xs ys = match xs,ys with
   | [], [] -> []
   | x :: xs, y :: ys -> f x y :: map2 f xs ys
   | _ -> invalid_arg "map2: list length mismatch"

Эта функция довольно проста - учитывая функцию f и два списка равной длины [x1; ...; xM] и [y1;...;yM] создает новый список, в котором i-й элемент является результатом f xi yi, то есть [f x1 y1; ...; f xM yM]. Например, теперь мы можем взять список операторов и список целочисленных списков и уменьшить каждый список, используя соответствующий оператор:

# map2 (fun op -> List.fold_left op 0) [(+); (-)] [[1;2;3]; [3;2;1]];;
- : int list = [6; -6]

Я думаю, что отсюда вы можете заполнить пробелы :)

И мой совет, не пытайтесь решить вашу проблему с помощью одной большой функции, которая делает все сразу, попробуйте сделать небольшие кусочки проблемы, кусочки, которые вы можете пережевать. В этом суть функционального (и любого другого) программирования - написание небольших компонуемых функций. Разделите задачу на маленькие подзадачи, решите каждую, затем объедините.

...