【问题标题】:Why does function containing Console.ReadLine() not complete?为什么包含 Console.ReadLine() 的函数不完整?
【发布时间】:2016-09-22 21:56:25
【问题描述】:

我用的是Visual Studio 2012,调用Console.ReadLine()的函数不会执行

let inSeq = readlines ()

在这个简单的程序中

open System
open System.Collections.Generic
open System.Text
open System.IO
#nowarn "40"

let rec readlines () =
    seq {
        let line = Console.ReadLine()
        if not (line.Equals("")) then
            yield line
            yield! readlines ()
}

[<EntryPoint>]
let main argv = 
    let inSeq = readlines ()

    0

我一直在试验和研究这个,看不出什么可能是一个非常简单的问题。

【问题讨论】:

  • 控制台上是否有一行供函数读取?它期待输入,并在收到换行符之前一直阻塞。
  • 我不太确定你在问什么。 VS 2012 调试器中的执行掉到程序的最后一行,无需等待输入。
  • 我明白了...... Reed 发布了我正在研究的答案,但做得更好。
  • 对我来说,所有的答案都很好。如果你愿意帮忙,就像玛莎喜欢说的那样,这是一件好事。谢谢。

标签: recursion f# seq


【解决方案1】:

F# 中的序列不会立即评估,而是仅在枚举时评估。

这意味着您的readlines 函数在您尝试使用它之前实际上什么都不做。通过对inSeq 执行操作,您将强制进行评估,这反过来又会使其表现得更像您的预期。

要查看实际情况,请执行一些枚举序列的操作,例如计算元素的数量:

open System
open System.Collections.Generic
open System.Text
open System.IO
#nowarn "40"

let rec readlines () =
    seq {
        let line = Console.ReadLine()
        if not (line.Equals("")) then
            yield line
            yield! readlines ()
}

[<EntryPoint>]
let main argv = 
    let inSeq = readlines ()

    inSeq 
    |> Seq.length
    |> printfn "%d lines read"

    // This will keep it alive enough to read your output
    Console.ReadKey() |> ignore
    0

【讨论】:

  • 您的回答解释了我在调试器中看到的许多奇怪行为。谢谢。
  • @octopusgrabbus 是的 - 序列是 IEnumerable,并且是“惰性的”。
【解决方案2】:

如果您将序列更改为 readLines() 中的列表,则无需“激活”序列即可运行输入递归:

open System
open System.Collections.Generic
open System.Text
open System.IO
#nowarn "40"

let rec readlines () =    
  [let line = Console.ReadLine()
   if not (line.Equals("")) then
     yield line
     yield! readlines ()]

[<EntryPoint>]
let main argv = 
    let inList = readlines ()

    printfn "END"
    Console.ReadLine() |> ignore
    0

非递归方法可能是这样的:

let readLines _ = 
  List.unfold (fun i -> 
                 let line = Console.ReadLine()
                 match line with
                 | "" -> None
                 | _ -> Some (line, i)) 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多