Эта страница содержит частичное объяснение того, что происходит, но короткая и приятная версия заключается в том, что F # выполнит любое значение в объявлении, если оно не принимает параметры.
let read =
printfn "Please enter a number."
System.Console.ReadLine
Поскольку read
не принимает никаких параметров, он выполняется сразу после объявления и связывает возвращаемое значение функции с идентификатором read
.
Кстати, ваше возвращаемое значение является функцией типа (unit -> string)
. Это происходит потому, что F # автоматически карри функционирует , если им не передаются все их параметры. ReadLine
ожидает один параметр модуля, но поскольку он не передается, вы фактически привязываете read
к самой функции ReadLine
.
Решение заключается в следующем:
let read() = // read takes one unit parameter
printfn "Please enter a number."
System.Console.ReadLine() // pass paramter to ReadLine method
Поскольку read
принимает один параметр, он переоценивается каждый раз, когда вызывается. Кроме того, мы передаем параметр в ReadLine
, в противном случае мы просто вернем функцию ReadLine
в качестве значения.