私は現在、F# と一般的な関数型プログラミングを独学で学ぼうとしている趣味のプログラマー (本業は料理人) です。
とにかく、私は浮気をしDeflateStream
て、次の2つの関数を書きました:
let Compress compressMe =
let ds = new DeflateStream(File.Create("compressed.txt"), CompressionMode.Compress)
File.OpenRead(compressMe).CopyTo(ds)
ds.Close()
let Decompress =
let ds = new DeflateStream(File.OpenRead("compressed.txt"), CompressionMode.Decompress)
ds.CopyTo(File.Create("decompressed.txt"))
ds.Close()
メイン関数の本体では、次のように次々と呼び出されます。
Compress args.[0]
Decompress
ただし、プログラムの実行時に compress.txt が存在しない場合、 がDecompress
スローされるのFileNotFoundException
は驚くべきことです。なぜなら、これをスローできるのは への呼び出しだけだからFile.OpenRead("compress.txt")
です。約1時間後、メイン関数でそれを呼び出す前に、それDecompress
が実装され、実行されていることがわかりました。IComparable
定義を変更する と、let Decompress () = [...]
実装されなくなりIComparable
、意図したとおりにコードが実行されることがわかりました。なぜ F# がIComparable
推論していたのか、なぜそのような推論によって関数が でマークされたメイン関数の前に実行されるのか教えてもらえます[<EntryPoint>]
か? また、私のコードの命令的なスタイルを許してください。私はこれに非常に慣れていません。
事前に感謝します。