F# 为什么';t Console.Readline工作,但Console.Readline()工作?

F# 为什么';t Console.Readline工作,但Console.Readline()工作?,f#,console,F#,Console,如何使用F#中的Console.Readline?与Console.Writeline不同的是,我称之为它时,它并没有受到尊重。你说的“它并没有受到尊重”是什么意思?下面是我刚刚用VS2010b1编写的一个小型控制台应用程序,它运行良好: open System let line = Console.ReadLine() Console.WriteLine("You wrote {0}", line) // Just to make it pause let unused = Console

如何使用F#中的Console.Readline?与Console.Writeline不同的是,我称之为它时,它并没有受到尊重。

你说的“它并没有受到尊重”是什么意思?下面是我刚刚用VS2010b1编写的一个小型控制台应用程序,它运行良好:

open System

let line = Console.ReadLine()
Console.WriteLine("You wrote {0}", line)

// Just to make it pause
let unused = Console.ReadLine()
您是否正在尝试在Visual Studio中从F#Interactive运行代码?如果是这样的话,正如布莱恩的帖子所解释的,这可能就是问题所在

但是,在命令行中使用F#Interactive时,我没有看到同样的问题。以下是一份完整的会议记录:

Microsoft F# Interactive, (c) Microsoft Corporation, All Rights Reserved
F# Version 1.9.6.16, compiling for .NET Framework Version v4.0.20506

Please send bug reports to fsbugs@microsoft.com
For help type #help;;

> open System;;
> let line = Console.ReadLine();;
Hello world

val line : string = "Hello world"
从F#Interactive运行Brian的循环代码并没有显示同样的问题


底线:在Visual Studio的F#Interactive中,这似乎被打破了,但在从命令行或完整控制台应用程序中以交互方式运行时就不是这样了。

我手边没有Beta1框,但我知道过去我们在ReadLine()中遇到了一个bug将看到在交互式UI和运行F#代码的后台进程之间进行通信的后台命令。研究什么可能是有趣的

let Foo max =
    let rec Loop i =
        if i < max then
            let line = System.Console.ReadLine() 
            printfn "line = %s" line
            Loop (i+1)
    Loop 1

Foo 12
让Foo max=
让rec循环一次=
如果我
突出显示并“发送至交互式”时打印。我想你可能会看到一些意想不到的有趣的行,然后是你在窗口中键入的行。

如果你使用

let s = Console.ReadLine
您只是在构建一个指向ReadLine函数的委托。你需要说

let s = Console.ReadLine()

以实际执行该函数。这与C#语法类似,只是类型推断意味着您不会收到编译器警告。

//如果您不想使用输入到readline中的任何内容的返回,这是正确的方法


Console.ReadLine()|>ignore

是的,这看起来可能是问题所在:当我在beta 1中尝试这一点时,写出的第一行只是“line=”区别在于你在ReadLine调用的末尾放了空参数,而我没有。我没有在交互模式下使用它。我只是在构建一些小的控制台应用。嗯。。。真奇怪。这是与VS2010b1一起安装的版本吗?奇怪。昨天,无论我怎么努力,我都无法让它工作。现在我不能让它再次失败,不管我怎么尝试。我明白了。“Console.ReadLine()”有效。“Console.ReadLine”被默默地忽略,因为它只是在生成一个委托。“let unused=Console.ReadLine()”将更像“Console.ReadLine()|>ignore”—这样就不需要一个无用的“let”语句并处理忽略返回值的问题。是的。Console.ReadLine是一个“单位->字符串”值。通过添加(),您将传入它期望作为参数的“unit”。+1-与函数的任何其他参数一样,在()前面需要一个空格可以使此行为更清楚。您将收到编译器警告!当你使用s。听起来你想写
Console.ReadLine()|>ignore
。我认为是C#不检查函数的输出是被捕获还是被忽略。