Пытаясь узнать больше о том, как работают вычислительные выражения, я пытаюсь закодировать построитель, который пропускает оставшуюся часть выражения после оценки блока then
оператора if
, после чего сам рабочий процесс оценивается как true
. Рабочий процесс должен возвращать false
, если ни один из операторов if
не оценивается как true
.
Например:
let mutable x = 0
let result =
earlyExit {
if false then x <- 99
if true then x <- 33
if true then x <- 11
}
Здесь result
должно быть true
, а x
должно быть 33
.
Самое близкое, что я получил, это:
type EarlyExitBuilder () =
member this.Combine (a, b) = a || b ()
member this.Delay fn = fn
member this.Run fn = fn ()
member this.Zero () = false
... что приводит к тому, что рабочий процесс оценивается как false
, а x
как 11
.
Это выполнимо, используя синтаксис в моем примере?