Я не уверен, что это поможет, но вы можете вообще избежать использования ключевого слова lazy
, если по какой-то причине вам это особенно необходимо:
type ('a, 'b) lazyT = Lz of 'a * ('a -> 'b)
let force (Lz (a, e)) = e a
let pack x = Lz(x, (fun i -> i))
type MyLazyBuilder =
| Mylazy
member this.Bind(x, f) =
match x with
| Lz(xa, xe) ->
Lz(xa, fun x -> force (f (xe x)))
member this.Return(x) = pack x
let sth =
Mylazy {
let! x = pack 12
let! y = pack (x + 1)
return y * x
}
let res = force sth
(отсутствует часть, где Force оценивает его только один раз)).
Поздно, но подумал, что стоит предложить.