【发布时间】:2010-09-15 17:27:49
【问题描述】:
我在我的代码中遇到了一个错误,这让我觉得我并不真正了解有关 F# 和惰性求值的一些细节。我知道 F# 急切地求值,因此对以下函数有些困惑:
// Open a file, then read from it. Close the file. return the data.
let getStringFromFile =
File.OpenRead("c:\\eo\\raw.txt")
|> fun s -> let r = new StreamReader(s)
let data = r.ReadToEnd
r.Close()
s.Close()
data
当我在 FSI 中调用它时:
> let d = getStringFromFile();;
System.ObjectDisposedException: Cannot read from a closed TextReader.
at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadToEnd()
at <StartupCode$FSI_0134>.$FSI_0134.main@()
Stopped due to error
这让我觉得 getStringFromFile 正在被懒惰地评估——所以我完全糊涂了。我不知道 F# 如何评估函数。
【问题讨论】:
标签: f# evaluation lazy-evaluation eager