В Scala я могу сделать что-то вроде этого:F # эквивалентно Scala ленивым Валу с футляром класс/предвзято объединение
abstract class MyData
case class A() extends MyData
case class B() extends MyData
implicit class HeavyComputationProvider(val data : MyData) {
private def _HeavyComputation() = /* */;
lazy val HeavyComputation = this._HeavyComputation();
}
// Example usage:
val a = A
println a.HeavyComputation // This will calculate
println a.HeavyComputation // This will use the cached value
Это имеет преимущество кэширования при повторном использовании, но не рассчитал, когда он не используется.
Как вы предоставляете ленивый HeavyComputation
для следующего типа F #?
type MyData =
| A
| B
type MyData with
member private this.__HeavyComputation = (* *)
// Error: This declaration element is not permitted in an augmentation and this is unavailable
let _HeavyComputation = lazy((* *))
// This will just create a *new* lazy computation each time
member this._HeavyComputation = lazy(this.__HeavyComputation)
// This should lazily compute & cache, transparent to the caller
member this.HeavyComputation = this._HeavyComputation.Force
Посмотреть http://cs.hubfs.net/topic/None/59072 – AlexFoxGill
@AlexG Спасибо, что частично решает проблему, но, к сожалению, «это» недоступно в 'let', я увеличил вопрос – dtech