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中,构造函数参数的处理有点棘手。如果构造函数只取一个值,则括号是可选的。因此,这两种情况下的表面语法看起来是相同的。这就是为什么它是一个奇怪的角落这种语言的特点。