希望这是连贯的,尽管很长。
我正在尝试在一个.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
中的函数中使用新属性值。
我觉得我错过了一些非常基本的东西,需要一些帮助!任何见解将不胜感激!
答案 0 :(得分:1)
由于函数在被调用时进行评估而不是在创建时(就像在C#中一样),您可以在ContactAngle
类型中创建一个正常的函数,如下所示:
member this.DoSomenthingWithTheta multiplier
m_theta <- m_theta * multiplier
您可以在班级的任何位置重复使用您的可变值。 为了澄清所有你应该阅读F# language reference的“成员”部分。
但是,如果您想在类型之外以及没有启动实例的地方使用该值。那么你必须采取不同的方法。例如,创建一个静态可变字段并使用static属性公开它。或者创建一个单例来在整个应用程序中存储您的值。
但这种杀死了函数式编程的“精神”:)。