Функция Ocaml, анализирующая список списков

#list #parsing #ocaml #ml

#Список #синтаксический анализ #ocaml #ml

Вопрос:

Я пытаюсь создать функцию в Ocaml, которая анализирует список списков, например, из [[0;1];[3;4;8]] чтобы [0;1;3;4;8]. Я пытался сделать что-то вроде:

 #let rec parse listoflists= 
   match listoflists with 
 [[]]->[]
|[h::t]->h::parse [t];;
 

но это не работает… Мне также нужно объяснение, потому что я не понимаю, как на самом деле работают списки списков…

Мне не нужно использовать функции библиотеки Ocaml.

Комментарии:

1. Мне не нужно использовать функции библиотеки Ocaml. Но можете ли вы? Вы описываете List.concat .

Ответ №1:

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

Единственная реальная трудность (на мой взгляд) заключается в том, чтобы отследить, о каком списке вы говорите. Ваш код должен работать с самим списком списков, который состоит из одного списка (назовите его h ), за которым следуют некоторые другие списки. Она также должна работать со списком h, который состоит из некоторого элемента (назовите его hh ), за которым следуют некоторые другие элементы.

Мне кажется, есть три интересных случая: (а) список списков пуст; (б) первый элемент списка списков h пуст (в) ни список списков, ни h пуст.

Вы не обрабатываете все три из этих случаев. Это один из способов увидеть, что ваш код, вероятно, не будет работать.

Вот match , который соответствует трем случаям, что может немного помочь:

 match listoflists with
| [] -> ...              (* List of lists is empty *)
| [] :: t -> ...         (* First list h is empty *)
| (hh :: ht) :: t -> ... (* Neither is empty *)