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

时间:2015-09-29 23:31:52

标签: module f# functional-programming evaluation

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

module Module1
open System

let foo =
    Console.WriteLine("bar")

然后,在互动中做

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

我看到了

  

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

表示foo函数在没有我调用的情况下运行了!

这是怎么发生的?有什么办法可以阻止吗?

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

2 个答案:

答案 0 :(得分:16)

在调用函数时,将根据需要评估函数体。您的问题是foo不是函数,它是变量。

要使foo成为函数,您需要为其指定参数。由于没有有意义的参数来提供它,单位值(())将是常规参数:

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

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

答案 1 :(得分:2)

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

如果您不想在通话时使用括号,type Test () = static member foo with get () = System.Console.WriteLine("bar")之类的内容可以使用Test.foo