【发布时间】:2012-04-29 03:37:42
【问题描述】:
我是一名业余程序员(职业厨师),目前正在尝试自学 F# 和一般的函数式编程。
反正我是在胡闹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()
在 main 函数的主体中,它们被一个接一个地调用,如下所示:
Compress args.[0]
Decompress
但是,如果在程序运行时compressed.txt 不存在Decompress 会引发FileNotFoundException,这令人惊讶,因为唯一可能引发此问题的是对File.OpenRead("compress.txt") 的调用。大约一个小时后,我发现 Decompress 正在实现 IComparable 并在主函数中调用它之前被执行。我发现通过将其定义更改为 let Decompress () = [...] 它不再实现 IComparable 并且我的代码按预期执行。谁能告诉我为什么 F# 推断IComparable 以及为什么这样的推断会导致函数在标有[<EntryPoint>] 的主函数之前执行?另外,请原谅我代码的命令风格,我对此非常陌生。
提前致谢。
【问题讨论】:
-
顺便说一下,DeflateStream 实现了 IDisposable,所以你应该使用“use”关键字而不是“let”来创建它。这将确保在流超出范围时正确处理(并关闭)流。见msdn.microsoft.com/en-us/library/dd233240(v=vs.110).aspx
-
谢谢,我会记住的。
-
它推断 IComparable 似乎很奇怪,因为据我所知,表达式的类型是单位(ds.Close i 单位的返回类型)
标签: f# type-inference