"if"表达问题

Her*_*ere 4 f#

我为"if"表达式测试了一些简单的F#代码,但结果对我来说意外:

> let test c a b = if c then a else b;;
val test : bool -> 'a -> 'a -> 'a
Run Code Online (Sandbox Code Playgroud)

然而

> test true (printfn "a") (printfn "b");;
a
b
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)

我希望只打印出"a",但在这里我得到了"a"和"b".我想知道为什么会出现这种情况?谢谢!

gra*_*bot 7

郝是对的.你必须将这些表达式包装在函数中以使它们变得懒惰.试试这个.

let test c a b = if c then a() else b();;
test true (fun () -> printfn "a") (fun () -> printfn "b");;
Run Code Online (Sandbox Code Playgroud)


hao*_*hao 6

可能是因为在测试调用发生之前评估了两个printfn函数调用?如果你希望两个函数调用都被延迟,直到实际使用它们,你可能需要延迟计算或宏(F#没有).