Asi*_*sik 0 f# functional-programming
我有一个类似于此的函数A,它将函数B应用于目录中的每个文件.每个文件都有一定数量的"条目"; 函数B将当前的条目总数作为参数,并返回当前文件中找到的新条目数.
此外,我需要计算处理的文件数,并在每次处理文件时显示此计数.由于我的命令背景,我提出了2个可变变量和一个for循环.
let files = Directory.EnumerateFiles sourceDirectory
let mutable numEntries = 0
let mutable numFiles = Seq.length files
let mutable index = 0
for file in files do
     printfn "done %d of %d" index numFiles
     let numNewEntries = processFile file numEntries
     numEntries <- numEntries + numNewEntries
     index <- index + 1
那么,有几个问题:
这是一个更实用的例子:
let files = Directory.EnumerateFiles sourceDirectory
let numFiles = Seq.length files
files 
|> Seq.mapi (fun idx file -> (idx,file)) // Get access to the index in a loop
|> Seq.fold (fun numentries (index,file) ->
         printfn "done %d of %d" index numFiles
         numentries + (processFile file numFiles)
         ) 0
通过使用mapi我能够访问循环中的索引,消除第一个可变变量.通过使用fold跟踪文件总数而不是可变变量来消除第二个.
这样做的主要优点是,没有任何可变状态,就可以更容易地将代码转换为在多个线程中运行.此外,由于变量是常量,因此对代码进行推理变得更加简单.