OCaml: преобразование каждой строки в списке в список строк

#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 это может быть неэффективным для объединения справа от списка