私は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) ファイルは変更されません (この行を書き込めば動作し、ファイルが変更されます)。 「let a =......」の場合、行に到着したときの「a」の値は、printfn行に続き、そこで「a」を「見た」ときよりも戻って、「の答えを計算します。 a'. それはなぜですか、印刷せずに機能を「開始」するにはどうすればよいですか??
また、関数「addNumber」の戻り値の型としてファイルを追加する必要がある理由を誰か教えてもらえますか? (これがどのように機能するかという理由でこれを追加しましたが、理由がよくわかりません....)
最後の質問- [] 定義の行の直後に COUNT 変数を書き込むと、エラーが発生し、定数を「変更可能」にすることはできないと言われますが、(これが私がそうした理由です) 前に別の行を追加すると (文字列) 間違いを「忘れ」、機能します。どうして?そして、本当に変更可能な const を持つことができない場合、どうすれば静的変数を作成できますか?