首页 > 解决方案 > 打印目录树

问题描述

我想制作一个包含目录树列表的代码,并打印出目录树。见下例。我对 Haskell 很陌生,想知道你们中是否有人会给我一些关于如何编写此代码的建议。

data FileOrFolder = File Int | Folder [ FileOrFolder ]
prettyPrint :: FileOrFolder -> IO ()

如果我输入以下输入:

prettyPrint (Folder 4 [Folder 2 [File 5, Folder 3 [File 1, File 1, File 2] ], File 3, Folder [], 
File 4])

输出应该是:

-Folder 4
    -Folder 2 
        -File 5
        -Folder 3
            -File 1
            -File 1
            -File 2
    -File 3 
    -Folder 0
    -File 4  

标签: haskell

解决方案


使用递归方法可以很好地遍历目录结构。如果您查看数据类型,您会发现它确实是一个递归数据结构,其中一个构造函数,即Folder,可以采用数据类型本身的任意长参数。

将目录结构视为树会有所帮助。让我们将File Ints 视为树的叶子和Folder [ FileOrFolder ]可以具有任意数量(包括 0)的叶子(文件)和/或其他节点(文件夹)的节点。

├── exercise.files
│   ├── identity.hs
│   ├── madness.hs
│   ├── maybe-another-monoid.hs
│   ├── optional-monoid.hs
│   └── trivial.hs
├── exercises.md
└── projects
    ├── empty_folder
    └── orphan-instance
        ├── Listy.hs
        └── ListyInstances.hs

这是treelinux 上命令的示例输出。如您所见,文件/文件夹在另一个文件夹中的主要指标是它们如何向右缩进。此缩进对应于根到节点/叶路径的长度(也称为节点的深度或级别)。当您使用您的算法深入递归堆栈时,您可以跟踪您在文件/文件夹的打印中回显了多少级别。

此外,这是预购深度优先搜索遍历,因为您想在子文件夹之前打印出父文件夹。


推荐阅读