Это сложная задача, потому что для этого требуются 2 взаимно рекурсивные функции: одна для Node
и одна для списка внутри Node
.
let rec processNode prepend node =
let rec processList prepend listOfNodes =
match listOfNodes with
| [] -> []
| (str, subNode) :: restList ->
let restList = processList prepend restList
let newPrepend = List.append prepend [ str ]
match processNode newPrepend subNode with
| [] -> [ newPrepend ]
| lst -> lst
@ restList
match node with Node listOfNodes -> processList prepend listOfNodes
processNode [] myFsT
|> List.iter print
Вам нужна одна рекурсивная функция для перемещения по элементам всписок: processList
и еще один, чтобы перейти к подузлам в списке: processNode
.
Путаница возникает из-за того, что все, что processNode
делает, это получает список от Node
и затем вызывает processList
, поэтому их легко представить себе так, как будто они могут быть только одной функцией.
OTOH, processList
является двойной рекурсивностью.Он вызывает себя, чтобы просмотреть элементы списка, и вызывает processNode
, чтобы углубиться в поддерево.
Существует также параметр аккумулятора, который необходимо передать, - prepend
, который содержит путь..