Data structures 表示文件/文件夹结构的最佳方式
我想表示一个文件结构,以便以后将其写入磁盘。我需要的是有一种方法来表示文件、文件夹、它们之间的关系和它们的内容。例如,表示如下所示的文件结构:Data structures 表示文件/文件夹结构的最佳方式,data-structures,ocaml,Data Structures,Ocaml,我想表示一个文件结构,以便以后将其写入磁盘。我需要的是有一种方法来表示文件、文件夹、它们之间的关系和它们的内容。例如,表示如下所示的文件结构: |-one.txt -> contains "This is file 1" |-aFolder | |-aNestedFolder | | |-aDoublyNestedEmptyFolder |-anotherFolder | |-aNestedFile -> contains "Contents of aNestedFile" |-ye
|-one.txt -> contains "This is file 1"
|-aFolder
| |-aNestedFolder
| | |-aDoublyNestedEmptyFolder
|-anotherFolder
| |-aNestedFile -> contains "Contents of aNestedFile"
|-yetAnotherEmptyFolder
我现在正在使用这个:
type fileTree =
| File of (string * string)
| Folder of (string * (fileTree list))
let example = [
File ("one.txt", "This is file 1");
Folder ("aFolder",
[Folder ("aNestedFolder",
[Folder ("aDoublyNestedEmptyFolder", [])])]) ;
Folder ("anotherFolder",
[File ("aNestedFile", "Contents of aNestedFile")]);
Folder ("yetAnotherEmptyFolder", []);
]
现在可以这样做了,但我想知道是否有更聪明的方法来表示这样的文件结构。您的表示方式非常简单,因此除非您有更具体的要求,否则很难想出更好的表示方式 一个微小的(或多或少是装饰性的)改变是使用:
type fileTree =
| File of string * string
| Folder of string * fileTree list
这不是同一种类型,当您不需要对的直接表示时,它会稍微有效一点
如果您想在这种结构中快速查找文件,并且如果结构将变得非常大,那么您可能需要使用嵌套映射或哈希表
更新
关于这两种类型之间的区别有一些讨论。之前在这里已经解释得很清楚了,但是我还没有找到页面。下面是一个展示差异的环节:
$ ocaml
OCaml version 4.02.1
# type f = A of (int * int);;
type f = A of (int * int)
# type g = B of int * int;;
type g = B of int * int
# let x = (8, 7);;
val x : int * int = (8, 7)
# A x;;
- : f = A (8, 7)
# B x;;
Error: The constructor B expects 2 argument(s),
but is applied here to 1 argument(s)
#
A
构造函数接受一个值,即一对整数。B
构造函数接受两个独立的int值,而不是一对
在内存中,f
类型的值将有一个标题和一个字段。一个字段将指向一对(一个标题和两个字段)。类型为g
的值只有一个标题和两个字段
这没什么大不了的,主要是有趣(至少对我来说)
更新2
关于这个问题,这里有一个很好的讨论:
请您解释一下,您的类型在哪些方面不同,并且更有效?本质上,
File of(string*string)
有一个字段是成对的,而File of string*string
有两个单独的字段。从对中检索元素需要稍长一点的时间,因为有一个额外的间接寻址。我对顶层进行了实验,但没有说明您所描述的内容:在类型声明type t=X of int*string
之后,表达式x2“abc”
的计算失败,出现语法错误,但是X(2,“ana”)
成功。类似地,将x2“ana”与xp匹配->p
失败,出现语法错误,并将X(2,“ana”)与X(p,)匹配->p成功。这表明X
应该有一对作为参数,而不是分开参数。在OCaml中,构造函数参数的处理有点棘手。如果构造函数只取一个值,则括号是可选的。因此,这两种情况下的表面语法看起来是相同的。这就是为什么它是一个奇怪的角落这种语言的特点。