Мы даем дерево, содержащее два типа элементов. Он определяется со следующей структурой данных.Функция OCaml с деревом данных
type ('a , 'b) tree =
Empty
| Vertexa of 'a * ('a , 'b) tree list
| Vertexb of 'b * ('a , 'b) tree list
Написать функцию раскола: («а,» б) дерево -> "список * список б, что сохраняет все элементы типа«а для первого списка и всех элементов типа»б в второй список.
У меня возникла идея сделать это рекурсивно, но я как бы застрял на этом. Я приложу свою попытку, даже если она вообще не работает:/
let rec one drevo_list=
match drevo_list with
| [Empty]->Empty
| Empty::tl -> one tl
| Vertexa(a,b)::tl -> Vertexa(a,[email protected])
| Vertexb(a,b)::tl -> Vertexb(a,[email protected])
Эта функция превращает список в дерево. Мне нужно было это для рекурсии, поскольку второй параметр в Vertexa или Vertexb - это список. И это работает Но рекурсивная часть этого не делает.
let rec split drevo=
match drevo with
| Empty -> [],[]
| Vertexa(a,b)-> split (one b)
| Vertexb(a,b)-> split (one b)
Эта часть не работает, и я понятия не имею, как ее закончить. Есть ли у кого-нибудь идея, как закончить это?
Вам не нужно преобразовывать дерево в рекурсию. Если вы сопоставляете 'split' с дочерними элементами, вы получите список' ('list *' b list'. Затем вы можете использовать сгиб, чтобы превратить это в «список» * b list', а затем вы почти закончили. (Не достаточно хорошо знакомы с OCaml специально для получения полного ответа.) – molbdnilo