FileSystem = [Dir ("Dir3",[]); Dir ("Dir1",[Dir ("Dir2",[])])]
让我们假设这是我的文件系统。我想递归计算该FileSystem中的文件数。有人可以指导我吗?我找不到相关文档,也不知道在哪里寻找。
type FileSystem = Element list and Element = | File of string | Dir of string * FileSystem
我的FileSystem结构如上。
答案 0 :(得分:1)
这种类型的递归查询通常依赖于fold函数遍历层次结构。
折叠函数采用可用于汇总结果的函数。在下面的示例中,内部counter
函数将到目前为止的累计计数以及列表中的下一个元素进行计算。然后,我们检查该元素,如果它是文件,则将其计数加1,否则,将其添加到子子目录中的文件计数。
let rec countFiles =
let counter i el =
i + match el with
| File _ -> 1
| Dir (_, children) -> countFiles children
List.fold counter 0
运行以下内容:
printfn "%A" <| countFiles
[ File "a"
Dir ("d1", [
File "b"
File "c"
])
]
// yields 3