为什么F#函数在被调用之前会被评估?

odk*_*ken 2 evaluation f# functional-programming module

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

module Module1
open System

let foo =
    Console.WriteLine("bar")
Run Code Online (Sandbox Code Playgroud)

然后,在互动中做

#load "Library1.fs" //where the module is defined
open Module1
Run Code Online (Sandbox Code Playgroud)

我看到了

[正在加载c:\ users\jj\documents\visual studio 2015\Projects\Library1\Library1\Library1.fs]栏

指示foo函数在没有我的情况下运行甚至调用它!

这是怎么发生的?有什么方法可以预防吗?

我知道foo的返回值是什么(Console.Writeline("bar"))评估,并且没有任何原因无法立即评估?(当我加载模块时?) - 但有没有办法阻止它发生?如果我的模块功能改变了其他一些东西的状态,我可以确保它们在被调用之前不进行评估吗?

sep*_*p2k 16

调用函数时,将根据需要评估函数体.你的问题是它foo不是一个函数,它是一个变量.

要创建foo一个函数,您需要为它提供参数.由于没有有意义的参数来提供它,单位value(())将是常规参数:

let foo () =
    Console.WriteLine("bar")
Run Code Online (Sandbox Code Playgroud)

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

  • *值*似乎是一个比*变量*更好的术语. (6认同)