为什么 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
应该可以。
如果我这样定义一个模块:
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
应该可以。