Я столкнулся с ошибкой в моем коде, которая заставляет меня думать, что я действительно не понимаю некоторых деталей о 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 # оценивает функции.