首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#“提前退出”计算表达式?

F#“提前退出”计算表达式?
EN

Stack Overflow用户
提问于 2016-07-13 00:09:27
回答 2查看 528关注 0票数 2

为了更多地了解计算表达式的工作方式,我尝试编写一个构建器,它在计算then语句的if块之后跳过表达式的其余部分,从而工作流本身将计算为true。如果没有计算到falseif语句,工作流应该返回true

例如:

代码语言:javascript
复制
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

我最近得到的是:

代码语言:javascript
复制
type EarlyExitBuilder () =
    member this.Combine (a, b) = a || b ()
    member this.Delay fn = fn
    member this.Run fn = fn ()
    member this.Zero () = false

..。这就导致了工作流对false的评估,x11的评估。

使用我的示例中的语法是否可行?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-13 15:42:20

给出您所要寻找的行为的最小更改可能是将return添加到计算中-- return构造可以返回true并提前终止计算:

代码语言:javascript
复制
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

代码语言:javascript
复制
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带中断和继续的扩展版本

票数 3
EN

Stack Overflow用户

发布于 2016-07-13 02:54:40

我认为使用您提议的语法没有任何好的方法;在计算表达式的内部,类似于

代码语言:javascript
复制
if c then e

将被编译成类似于

代码语言:javascript
复制
if c then 
    e
    builder.Zero() 
else 
    builder.Zero()

因此,上下文无法区分哪个分支被采用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38340711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档