【发布时间】:2014-07-05 08:04:11
【问题描述】:
我有一个对象可以用一个有区别的联合来巧妙地描述。它所代表的树具有一些属性,这些属性可以在修改树时轻松更新(但保持不可变),但重新计算的成本相对较高。
我想将这些属性与对象一起存储为缓存值,但我不想将它们放入每个可区分的联合案例中,所以我认为一个成员变量适合这里。
那么问题是,如何在不改变实际对象的情况下更改成员值(当我修改树时)?我知道我可以修改树然后在不破坏纯度的情况下改变该副本,但这对我来说似乎是一种错误的方式。如果有一些预定义的方法来更改属性,但这样操作的结果是更改了该属性的新对象,这对我来说是有意义的。
澄清一下,当我说修改时,我的意思是以一种功能性的方式进行。像 (::) 一样“附加”到列表的开头。我不确定这里的正确术语是什么。
【问题讨论】:
-
您能否给出一个有代表性的代码示例来说明您正在尝试做什么?从你的描述看来你想吃蛋糕也想吃蛋糕……
-
由于我的实际用例有点复杂,我还在想办法,这里有一个简化的例子。假设您有一个分数,并且您决定将其表示为整数元组。现在,让我们假设计算分数的十进制表示非常昂贵。我可以有一个函数 addOne ,它只做 (x, y) -> (x + y, y) ,因为我知道 addOne 做什么,我也知道我只需要 (+1) 十进制表示。但是因为我的类型只是一个元组,没有地方缓存那个值,所以我每次都不得不重新计算,我不能使用 (+1) 快捷方式。
-
因为我喜欢将分数作为元组而不是像 ((x, y), decimal) 这样的东西,所以我决定将缓存存储为成员变量。但是,如何实现我的 addOne 函数,使其不仅修改元组,还修改成员缓存?
-
好的,那我给你一个代码示例,你告诉我我有多接近
-
为什么不使用记录语法——看起来像
let modified a = {a with b=c}
标签: f#