我是 f# 的新手,我尝试编写一个程序,该程序应该遍历给定目录中的所有文件,并为每个“.txt”类型的文件添加一个 id 号 +“DONE”到文件中。
我的程序:
//const:
[<Literal>]
let notImportantString= "blahBlah"
let mutable COUNT = 1.0
//funcs:
//addNumber --> add the sequence number COUNT to each file.
let addNumber (file : string) =
let mutable str = File.ReadAllText(file)
printfn "%s" str//just for check
let num = COUNT.ToString()
let str4 = str + " " + num + "\n\n\n DONE"
COUNT <- COUNT + 1.0
let str2 = File.WriteAllText(file,str4)
file
//matchFunc --> check if is ".txt"
let matchFunc (file : string) =
file.Contains(".txt")
//allFiles --> go through all files of a given dir
let allFiles dir =
seq
{ for file in Directory.GetFiles(dir) do
yield file
}
////////////////////////////
let dir = "D:\FSharpTesting"
let a = allFiles dir
|> Seq.filter(matchFunc)
|> Seq.map(addNumber)
printfn "%A" a
我的问题:
Tf 我没有写最后一行(printfn "%A" a)文件不会改变。(如果我写了这一行,它可以工作并更改文件)当我使用调试器时,我发现它并没有真正计算'a' 的值当它到达该行时,如果“let a =......”它继续到 printfn 行,而不是当它“看到”那里的 'a' 时,它会返回并计算 ' 的答案一种'。为什么会这样?如何在不打印的情况下“启动”该功能?
还有-有人能告诉我为什么我必须添加文件作为函数“addNumber”的返回类型吗?(我添加这个是因为它是如何工作的,但我真的不明白为什么......)
最后一个问题 - 如果我在 [] 定义的行之后立即编写 COUNT 变量,它会给出一个错误并说一个常量不能是“可变的”但是如果一个添加(这就是我这样做的原因)之前的另一行(比如字符串)它“忘记”错误并起作用。为什么?如果你真的不能有一个可变的 const 我怎么能做一个静态变量?