Код в walkTree
просматривает дерево файлов, представленное в списке fileTree
узлов. Он делает то, что я хочу, чтобы рекурсивно печатать каждую запись в дереве. Но я чувствую, что это может быть значительно улучшено. Я также думаю, что я саботирую хвостовую рекурсию, запустив 2 заявления о посещении в конце сопоставления patern.Как можно улучшить эту рекурсивную функцию?
type 'a fileTree =
| File of 'a
| Folder of 'a * ('a fileTree list)
let fileTreeStructure = [
File "file1.txt" ;
Folder ("testFolder1", [Folder ("nestedFolder1", [])]) ;
File "test1.txt";
Folder ("testFolder2", [Folder ("nestedFolder2", [])]) ;
File "test2.txt";
]
let walkTree tree =
let rec visit = function
| [] -> print_string "\n"
| File f :: t ->
Printf.printf "file: %s\n" f ;
visit t
| Folder (name, contents) :: t ->
Printf.printf "name: %s\n" name ;
visit contents ;
visit t in
visit tree;;
walkTree fileTreeStructure
Что было бы лучшим способом сделать это?
Вы можете использовать взаимную рекурсию в ветви папки, чтобы вызвать внешний список List.iter в списке (один раз с именем). – nlucaroni
Отличный ответ, спасибо! – GiantSquid