为什么printfn会立即在f#中打印?

时间:2016-07-12 20:40:02

标签: f#

当我运行以下代码时,我从mySum打印出5050。我已经定义了mySum,但从未调用它。怎么打印呢?也许这很奇怪,因为我的背景是Haskell而且我习惯于传递IO monad来做事情 - 在F#中如何/何时评估事物?

type main = obj [] -> int

let mySum =  [1..100] |> List.sum |> printfn "%i"


[<EntryPoint>]
let main argv = 
    0

1 个答案:

答案 0 :(得分:13)

  

我已经定义了mySum,但从未调用它。

mySum不是函数,因为它不需要参数。一个函数必须至少有一个参数;如果没有任何“有用”可以传递,那通常是unit()

mySum是一个值;更具体地说,您将表达式[1..100] |> List.sum |> printfn "%i"的值绑定到名称mySum。该值依次为(),因为printfn仅导致副作用并返回unit。当绑定值时立即计算表达式,剩下的只是副作用和实际值。

作为一项功能,mySum将如下所示:

let mySum () =  [1..100] |> List.sum |> printfn "%i"

调用它只是

mySum ()

这会导致打印出值5050,并且会自动忽略()的返回值。