haskell - 打印目录树
问题描述
我想制作一个包含目录树列表的代码,并打印出目录树。见下例。我对 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
解决方案
使用递归方法可以很好地遍历目录结构。如果您查看数据类型,您会发现它确实是一个递归数据结构,其中一个构造函数,即Folder
,可以采用数据类型本身的任意长参数。
将目录结构视为树会有所帮助。让我们将File Int
s 视为树的叶子和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
这是tree
linux 上命令的示例输出。如您所见,文件/文件夹在另一个文件夹中的主要指标是它们如何向右缩进。此缩进对应于根到节点/叶路径的长度(也称为节点的深度或级别)。当您使用您的算法深入递归堆栈时,您可以跟踪您在文件/文件夹的打印中回显了多少级别。
此外,这是预购深度优先搜索遍历,因为您想在子文件夹之前打印出父文件夹。
推荐阅读
- java - 正则表达式获取单词后的字符串
- java - 列索引超出范围:1,列数:0 但似乎我的值计数等于我的列计数
- java - Spring boot 和 Gradle 多模块项目,无法正确加载依赖项
- c - 如何在 C 中包含“sthread.h”
- javascript - asyncjs:`未捕获(承诺)错误:..`
- node.js - 在 Express 中使用休息 api:未找到用户 ID
- django - django m2m 字段返回对象而不是键
- swift - 使用 IOBluetoothHostController.default() 时的异常
- .net-core - 实现 Google Calendar API 以获取 ASP.NET 核心中的事件列表
- sql - How to Extract Each Component in Array using Hive