#recursion #ocaml
#рекурсия #ocaml
Вопрос:
У меня есть две функции, одна из которых
let make_row delim str = List.map String.trim (Str.split (Str.regexp delim) str)
а другой
let rec table_of_stringlist delim rlist = match rlist with
| h::[]-> make_row delim h
| h::t -> table_of_stringlist delim (make_row delim h)::t)
но второй вызывает у меня проблемы. Я пытаюсь сделать так, чтобы это по существу table_of_stringlist d [r1;r2;...;rN]
должно оцениваться [(make_row d r1); (make_row d r2); ...; (make_row d rN)]
. Значение d является разделителем, поэтому, например table_of_stringlist "|" ["a|b|c"; "d|e"]
, должно быть равно
[["a";"b";"c"]; ["d";"e"]]
. Я запутался в том, как записать мои совпадения во второй функции. Любая помощь была бы отличной.
Ответ №1:
Вы захотите передать новый список (таблицу) по вашей рекурсивной функции при ее создании, возвращая этот новый список, как только вы дойдете до конца rlist
let rec table_of_stringlist delim rlist table = match rlist with
| [] -> table
| h::t->
let new_row = make_row delim h in
table_of_stringlist delim t (table @ [new_row])
Когда вы вызываете его в первый раз, передайте пустой список как table
.
Примечание: я на самом деле не тестировал приведенный выше фрагмент, поэтому он может быть синтаксически некорректным, но он должен быть близок к тому, что вам нужно.
Комментарии:
1. Что было бы хорошим способом сделать это без реализации table? Поэтому я просто конвертирую строки в rlist в список строк
2. Да, это то, что это делает, таблица — это просто список списка строк в данном случае, я просто назвал его
table
, вы можете называть его как хотите3. в зависимости от размера rlist это может быть неэффективным для объединения справа от списка