0

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

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

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

然后我想定义一个Q函数function.fs

function Q = Q(r)和... Q(r)取决于一些依赖于 的计算theta

A1(theta), A2(theta), A3(theta)

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

我还想在我的主 .fs 文件中维护一组 theta 值program.fs(即
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

这使我可以重新定义 value theta。我苦苦挣扎的地方是我现在如何在function.fs.

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

4

1 回答 1

1

由于函数在调用时评估而不是在创建时评估(就像在例如 C# 中一样),您可以ContactAngle像这样在您的类型中创建一个普通函数:

member this.DoSomenthingWithTheta multiplier
    m_theta <- m_theta * multiplier

您可以在班级的任何地方重用您的可变值。为了澄清您应该阅读F# 语言参考的“成员”部分的所有内容。

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

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

于 2012-10-14T08:43:47.410 回答