Для быстрого объяснения того, что происходит, давайте начнем здесь:
let getStringFromFile =
File.OpenRead("c:\\eo\\raw.txt")
|> fun s -> let r = new StreamReader(s)
let data = r.ReadToEnd
r.Close()
s.Close()
data
Вы можете переписать первые две строки вашей функции следующим образом:
let s = File.OpenRead(@"c:\eo\raw.txt")
Далее выв этом методе опущены скобки:
let data = r.ReadToEnd
r.Close()
s.Close()
data
В результате data
имеет тип unit -> string
.Когда вы возвращаете это значение из своей функции, весь результат равен unit -> string
.Но посмотрите, что происходит между присвоением вашей переменной и ее возвратом: вы закрыли свои потоки.
Конечный результат, когда пользователь вызывает функцию, потоки уже закрыты, что приводит к ошибке, которую вы видите выше.
И не забудьте избавиться от своих объектов, объявив use whatever = ...
вместо let whatever = ...
.
Имея это в виду, вот исправление:
let getStringFromFile() =
use s = File.OpenRead(@"c:\eo\raw.txt")
use r = new StreamReader(s)
r.ReadToEnd()