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 ())