F#奇怪的printfn问题

F#奇怪的printfn问题,f#,F#,我在玩F#(VisualStudio2010Beta1),我编写了一个小控制台脚本,要求用户输入两个数字和一个运算符,然后执行它。 它工作得很好,除了一件很小但很烦人的事情:有时我的printfn指令会被忽略。我在代码中放置了断点,以查看实际情况 代码片段: let convert (source : string) = try System.Int32.Parse(source) with :? System.FormatException -> prin

我在玩F#(VisualStudio2010Beta1),我编写了一个小控制台脚本,要求用户输入两个数字和一个运算符,然后执行它。 它工作得很好,除了一件很小但很烦人的事情:有时我的printfn指令会被忽略。我在代码中放置了断点,以查看实际情况

代码片段:

let convert (source : string) =
    try System.Int32.Parse(source)
    with :? System.FormatException ->
        printfn "'%s' is not a number!" source;
        waitForExitKey();
        exit 1

let read =
    printfn "Please enter a number.";
    System.Console.ReadLine

let num1 : int = read() |> convert // the printfn in the read function is run...
let num2 : int = read() |> convert // ... but here is ignored
这当然不是完整的来源,但我认为这就足够了。如果你需要完整的来源,请告诉我

所以我的问题很简单:是什么导致printfn出现这个问题?我做错什么了吗

提前感谢,,
ShdNx

我理解这可能会令人困惑。在您的示例中,
printfn
的运行时间比您想象的要早。即使不调用
read()
,它实际上也会执行,即注释掉最后两行,您仍然会看到正在打印的消息

我想你的意图是这样的:

let read() =
    printfn "Please enter a number.";
    System.Console.ReadLine()
这将创建一个“可重用”函数,而不是像原始示例中那样将函数绑定到标识符

作为旁注,此处分号的使用是可选的,因此您可以只写:

let read() =
    printfn "Please enter a number."
    System.Console.ReadLine()
对所发生的事情有一个部分的解释,但简短的版本是,如果F#不带参数,它将在声明中执行任何值

let read =
    printfn "Please enter a number."
    System.Console.ReadLine
由于
read
不接受任何参数,它在声明时立即执行,并将函数的返回值绑定到标识符
read

顺便说一句,您的返回值恰好是一个类型为
(unit->string)
的函数。这是因为如果F#没有通过所有参数,则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
函数作为值。

非常感谢,我想我现在明白了!我使用分号是因为我会在每一行后面自动添加一个分号,如果我看不到任何分号,我会感到困扰…:-)非常感谢你!不幸的是,雷跑得更快,所以我接受了他的回答。但我还是很高兴你说得很清楚。再次感谢!