使用F#中的属性

时间:2012-10-14 08:07:22

标签: f# module

希望这是连贯的,尽管很长。

我正在尝试在一个.fs文件中创建一个属性,我可以从单独的.fs文件中设置该属性,然后在第一个.fs文件的模块中使用该值。例如,

在我的第一个文件function.fs中,我想定义一个属性theta

我想在Q中定义一个函数function.fs,以便:

function Q = Q(r)和......     Q(r)取决于某些依赖于theta
的计算 即
A1(theta), A2(theta), A3(theta)

Q以列表的形式返回数据集。

我还想在我的主.fs文件program.fs中维护一组theta值(即     theta = [90;120;150;180])

我希望为每个function.fs生成theta的数据集。

我的想法是通过设置属性theta的值,运行程序来生成数据集,为theta设置新值,运行程序以生成数据集,重复..我做了大量的研究,我不清楚的是我如何在Q(r)的代码中回忆起该属性的价值。

我已在function.fs文件中成功设置了一个可以从program.fs设置的属性:
function.fs我有:

namespace models.test

type ContactAngle() =
    let mutable m_theta = 90.0
    //read only property
    member this.Empty = 
         m_theta = 90.0
     //read-write property
     //i think i'm onto something with this static...
     member this.Angle
         with get() =
             m_theta
         and set newAmt = 
             m_theta <- newAmt

//module HTModel =

program.fs我有:

open models.test

let me = new ContactAngle()
printfn "%A" me.Angle
me.Angle <- 120.0
printfn "%A" me.Angle

这允许我重新定义值theta。我正在努力的地方是我现在如何在function.fs中的函数中使用新属性值。

我觉得我错过了一些非常基本的东西,需要一些帮助!任何见解将不胜感激!

1 个答案:

答案 0 :(得分:1)

由于函数在被调用时进行评估而不是在创建时(就像在C#中一样),您可以在ContactAngle类型中创建一个正常的函数,如下所示:

member this.DoSomenthingWithTheta multiplier
    m_theta <- m_theta * multiplier

您可以在班级的任何位置重复使用您的可变值。 为了澄清所有你应该阅读F# language reference的“成员”部分。

但是,如果您想在类型之外以及没有启动实例的地方使用该值。那么你必须采取不同的方法。例如,创建一个静态可变字段并使用static属性公开它。或者创建一个单例来在整个应用程序中存储您的值。

但这种杀死了函数式编程的“精神”:)。