为什么 F# 函数在调用之前先求值?

Why do F# functions evaluate before they are called?

如果我这样定义一个模块:

module Module1
open System

let foo =
    Console.WriteLine("bar")

然后,在交互中做

#load "Library1.fs" //where the module is defined
open Module1

我看到一个

[Loading c:\users\jj\documents\visual studio 2015\Projects\Library1\Library1\Library1.fs] bar

表明 foo 函数 运行 我什至没有调用它!

How/why 会发生这种情况吗?有什么办法可以预防吗?

我知道 foo 的 return 值是 (Console.Writeline("bar")) 的任何值,并且没有任何理由不能被评估 "immediately?" (我猜是在加载模块时?) - 但有没有办法防止它发生?如果我的模块函数改变了其他一些东西的状态,我能否确保它们在被调用之前不求值?

函数体在调用函数时被计算,正如您所希望的那样。你的问题是 foo 不是一个函数,它是一个变量。

要使foo成为一个函数,你需要给它参数。由于没有有意义的参数给它,单位值(())将是常规参数:

let foo () =
    Console.WriteLine("bar")

因此,此函数的调用看起来像 foo ()

我相信 let foo = x 本质上是一个静态值,可以立即评估一次。如果你想要一个无参数函数,你需要 let foo () = Console.WriteLine("bar"),将其用作 foo ().

如果您不想在调用时使用括号,可以使用 type Test () = static member foo with get () = System.Console.WriteLine("bar") 之类的方法,将其用作 Test.foo 应该可以。