我有一个带有模块的文件,其中包含一些带参数和返回单位的例程,这些例程有副作用。我注意到当从c#访问这些f#例程时,它们实际上是单元类型的属性,当我尝试访问1个属性时,它会运行模块中的所有属性。
从F#文档中,所有顶级的绑定都在类型初始化上运行。
编写函数的首选方法是什么?不在类型初始化上运行,但不与其他状态相关联,即具有函数和成员变量的类?
我应该将这些函数放在一个类型中,而且类型中没有记录吗?
代码示例:
namespace test_space
open System.Diagnostics;
module test =
let test_1 =
Debug.WriteLine ("One")
let test_2 =
Debug.WriteLine ("Two")
我用C#运行此代码:
static void Main (string [] args)
{
Object o;
o = test.test_2;
}
输出是:
一个
两个
答案 0 :(得分:3)
问题是你没有创建函数而是值绑定。 test_1是一个值。 test_1()是单位类型的函数 - >单元。确保在函数名后面加上()。
答案 1 :(得分:0)
我不完全理解您所描述的场景 - 模块中声明的F#函数通常显示为方法,值将显示为属性。第一次访问模块时执行的代码(类型初始化)是值的初始化。
如果你只写:
module Foo =
let Operation () =
printfn "hello"
...然后调用Operation
将是一种方法,调用Foo.Operation()
将运行副作用。如果您可以发布一些行为异常的代码,那么有人可以解释它。
无论如何,如果你想确定行为,可以将操作编写为类的静态成员:
type Foo =
static member Operation() =
printfn "hello"
然后你可以确定F#会以可预测的方式将它们编译为类的静态成员。