F#顶级做绑定

时间:2011-06-23 23:15:24

标签: f# c#-to-f#

我有一个带有模块的文件,其中包含一些带参数和返回单位的例程,这些例程有副作用。我注意到当从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;
}

输出是:

一个
两个

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#会以可预测的方式将它们编译为类的静态成员。