F#“退出早期”计算表达式?
在试图更多地了解计算表达式如何工作时,我试图编写一个编译器,在评估if
语句的then
块之后跳过表达式的其余部分,因此工作流本身将评估为true
。 如果没有if
语句评估为true
, if
工作流应该返回false
。
例如:
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
。
这是可行的使用我的例子中的语法?
这会给你,你正在寻找的行为的最小变化可能是增加return
的计算-的return
结构可以返回true
和提前终止的评价:
let mutable x = 0
let result =
earlyExit {
if false then return x <- 99
if true then return x <- 33
if true then return x <- 11
}
这个评估为true
, x
的值将是33
。 计算生成器与您的计算生成器相同,额外的Return
成员返回true
:
type EarlyExitBuilder () =
member this.Combine (a, b) = a || b ()
member this.Delay fn = fn
member this.Run fn = fn ()
member this.Zero () = false
member this.Return( () ) = true
正如其中一个引用的答案中提到的,这与我的命令式计算构建器有些相关,它允许您使用命令式return
和带有中断和继续的扩展版本。
我认为没有什么好的方法可以用你提出的语法来做到这一点; 在计算表达式内部,类似
if c then e
将会被编译成类似的东西
if c then
e
builder.Zero()
else
builder.Zero()
所以上下文无法区分哪个分支被采用。
链接地址: http://www.djcxy.com/p/24423.html上一篇: F# "exit early" computation expression?
下一篇: Why would you use Builder.Source() in a custom computation expression builder?