F # lazy eval от потокового чтения?

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

5
задан Kevin Won 15 September 2010 в 17:27
поделиться