我是一个爱好者程序员(由贸易厨师),目前正试图自学F#和函数式编程。为什么F#推断我的函数实现了IComparable?
反正我是用DeflateStream
打打闹闹,并写了下面的两个功能:
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
但是,如果程序运行时不存在compressed.txt,则Decompress
会抛出FileNotFoundException
,这是令人惊讶的,因为唯一可能引发此问题的是致电File.OpenRead("compress.txt")
。大约一个小时后,我发现Decompress
正在执行IComparable
,并且在主函数调用它之前正在执行。我发现通过将其定义更改为let Decompress() = [...]
,它不再执行IComparable
,并且我的代码按照它的意图执行。任何人都可以告诉我为什么F#推断IComparable
以及为什么这样的推理会导致函数在标记为[<EntryPoint>]
的主函数之前执行?另外,请原谅我的代码的不完美风格,我对此非常感兴趣。
感谢adavance。
顺便说一句,DeflateStream实现IDisposable,所以你应该使用“使用”的关键字,而不是“让”来创建它。这将确保当流超出范围时流正确处置(并关闭)。请参阅http://msdn.microsoft.com/en-us/library/dd233240(v=vs.110).aspx – Asik 2012-04-29 03:52:09
谢谢,我会牢记这一点。 – 2012-04-29 04:14:13
似乎很奇怪,它传染IComparable,因为表达式的类型是单位据我可以告诉(返回类型ds.Close我单位) – 2012-04-29 20:00:12