F#等价于带有case类/判别并集的Scala lazy val
在Scala中,我可以这样做:F#等价于带有case类/判别并集的Scala lazy val,f#,lazy-evaluation,lazy-initialization,F#,Lazy Evaluation,Lazy Initialization,在Scala中,我可以这样做: 抽象类MyData case类A()扩展了MyData case类B()扩展了MyData 隐式类HeavyComputationProvider(val数据:MyData){ 私有def_heavycompution()=/**; lazy val heavycompution=这个; } //用法示例: val a=a println a.heavy计算//这将计算 println a.heavycompution//这将使用缓存的值 这样做的好处是在重复使
抽象类MyData
case类A()扩展了MyData
case类B()扩展了MyData
隐式类HeavyComputationProvider(val数据:MyData){
私有def_heavycompution()=/**;
lazy val heavycompution=这个;
}
//用法示例:
val a=a
println a.heavy计算//这将计算
println a.heavycompution//这将使用缓存的值
这样做的好处是在重复使用时进行缓存,但在未使用时不会进行计算
如何为以下F#type提供lazyheavycompution
我认为没有Scala方法的直接等价物。这样做需要保留一些附加状态作为对象的一部分(例如,惰性值),并且F#不允许在定义对象后向其添加附加状态 您可以做的最接近的事情是编写一个包装器类型,将原始的
MyData
值与附加的延迟计算一起存储:
type MyData =
| A
| B
type MyDataWithComputation(data:MyData) =
let _HeavyComputation = lazy(1)
member this.MyData = data
member this.HeavyComputation = _HeavyComputation.Value
然后按如下方式使用:
let myd = MyDataWithComputation(A)
myd.HeavyComputation
myd.HeavyComputation
请参阅@AlexG谢谢,这部分解决了问题,但不幸的是,
这个
在let
中不可用,我补充了这个问题
let myd = MyDataWithComputation(A)
myd.HeavyComputation
myd.HeavyComputation