Как получить список листьев в этом дереве?Проблема в OCaml - PullRequest
0 голосов
/ 15 апреля 2019

Нам дано дерево с типом:

type ('nonterminal, 'terminal) parse_tree =
  | Node of 'nonterminal * ('nonterminal, 'terminal) parse_tree list
  | Leaf of 'terminal

и формой:

let t = (Node ("+", [Leaf 3; Node ("*", [Leaf 4; Leaf 5])])

И нас просят написать функцию, которая принимает дерево в качестве аргументаи возвращает список листьев, которые он находит (форма слева направо), поэтому оставляет t = [3; 4; 5]

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

let rec getleaf tree = 
  match tree with
  |Leaf a -> [a]
  | Node (a, Leaf (h)::t) -> h::getleaf t;;

Заранее спасибо.

1 Ответ

0 голосов
/ 15 апреля 2019

Шаблон списка h :: t связывает h с заголовком списка (один элемент) и t с хвостом списка (который сам является списком).Таким образом, имя t в вашем коде будет соответствовать списку деревьев разбора.Но getleaf ожидает единственное дерево разбора в качестве аргумента.

Обновление

Обычно, вероятно, getleaf принимает одно дерево,В коде для Node вам потребуется произвольное количество рекурсивных вызовов, которые вы затем объедините, чтобы получить результат для этого одного узла.складка (ИМХО).Вы также можете использовать List.map (что даст список списков), а затем List.concat, чтобы вернуться к одному списку.Об этом легче думать (ИМХО), но он делает некоторые ненужные вычисления.

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

...