F#“​​退出早期”计算表达式?

在试图更多地了解计算表达式如何工作时,我试图编写一个编译器,在评估if语句的then块之后跳过表达式的其余部分,因此工作流本身将评估为true 。 如果没有if语句评估为trueif工作流应该返回false

例如:

let mutable x = 0

let result =
    earlyExit {
        if false then x <- 99
        if true then x <- 33
        if true then x <- 11
    }

这里的result应该是truex应该是33

我得到的最接近的是:

type EarlyExitBuilder () =
    member this.Combine (a, b) = a || b ()
    member this.Delay fn = fn
    member this.Run fn = fn ()
    member this.Zero () = false

...导致工作流评估为falsex11

这是可行的使用我的例子中的语法?


这会给你,你正在寻找的行为的最小变化可能是增加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
    }

这个评估为truex的值将是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?