F# Console.ReadLine 不等待输入
F# Console.ReadLine not waiting for input
我是 F# 的新手,如果我在这里遗漏了一些明显的东西,我深表歉意。
我有以下代码,目的是获取用户输入并将其转换为 uint:
let println ln =
printfn "%s" ln
let rec getUserKeyInput =
let x = System.Console.ReadKey()
string x
let getInputWithPrompt prompt =
println prompt
getUserKeyInput
let rec getUserUIntFromStr str =
try
let i = str |> uint
i
with
| :? System.FormatException -> println "Please enter a positive integer";
(getUserUIntFromStr (getUserKeyInput))
当使用 let i = getUserUIntFromStr str
调用 getUserUIntFromStr 时,会无限打印“请输入一个正整数”。我还尝试了 Console.ReadLine() 和 stdin.ReadLine(),无论是在交互式还是在主界面,都得到了相同的结果。在我看来,“读取”函数的 none 正在等待输入,但这似乎不对,我猜我做错了什么。有什么建议吗?
getUserKeyInput
是一个值,不是函数。它只在初始时计算一次,而不是每次引用它时。
要让它成为一个函数,你需要给它一个参数。什么类型的参数?好吧,从技术上讲,任何类型都可以,但是 F# 已经涵盖了:对于您需要一些值,但没有一个合理的值可供使用的情况(这种情况经常出人意料地发生),有一种特殊类型 unit
的单个值表示为括号 ()
:
let getUserKeyInput () =
let x = System.Console.ReadKey()
string x
(另请注意 rec
是不必要的,因为该函数实际上不是递归的)
(另请注意 ReadKey
也采用此类参数 - 那里的交易相同)
然后传参调用函数:
println "Please enter a positive integer"
getUserUIntFromStr (getUserKeyInput ())
我是 F# 的新手,如果我在这里遗漏了一些明显的东西,我深表歉意。 我有以下代码,目的是获取用户输入并将其转换为 uint:
let println ln =
printfn "%s" ln
let rec getUserKeyInput =
let x = System.Console.ReadKey()
string x
let getInputWithPrompt prompt =
println prompt
getUserKeyInput
let rec getUserUIntFromStr str =
try
let i = str |> uint
i
with
| :? System.FormatException -> println "Please enter a positive integer";
(getUserUIntFromStr (getUserKeyInput))
当使用 let i = getUserUIntFromStr str
调用 getUserUIntFromStr 时,会无限打印“请输入一个正整数”。我还尝试了 Console.ReadLine() 和 stdin.ReadLine(),无论是在交互式还是在主界面,都得到了相同的结果。在我看来,“读取”函数的 none 正在等待输入,但这似乎不对,我猜我做错了什么。有什么建议吗?
getUserKeyInput
是一个值,不是函数。它只在初始时计算一次,而不是每次引用它时。
要让它成为一个函数,你需要给它一个参数。什么类型的参数?好吧,从技术上讲,任何类型都可以,但是 F# 已经涵盖了:对于您需要一些值,但没有一个合理的值可供使用的情况(这种情况经常出人意料地发生),有一种特殊类型 unit
的单个值表示为括号 ()
:
let getUserKeyInput () =
let x = System.Console.ReadKey()
string x
(另请注意 rec
是不必要的,因为该函数实际上不是递归的)
(另请注意 ReadKey
也采用此类参数 - 那里的交易相同)
然后传参调用函数:
println "Please enter a positive integer"
getUserUIntFromStr (getUserKeyInput ())