Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#等价于带有case类/判别并集的Scala lazy val_F#_Lazy Evaluation_Lazy Initialization - Fatal编程技术网

F#等价于带有case类/判别并集的Scala lazy val

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//这将使用缓存的值 这样做的好处是在重复使

在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//这将使用缓存的值
这样做的好处是在重复使用时进行缓存,但在未使用时不会进行计算

如何为以下F#type提供lazy
heavycompution


我认为没有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