gpt4 book ai didi

f# - 如何在 F# 中实现 "return early"逻辑

转载 作者:行者123 更新时间:2023-12-04 01:46:37 26 4
gpt4 key购买 nike

我熟悉在 F# 中没有等效的“返回”关键字这一事实。

然而,我们最近遇到了一个问题,我们需要一个由许多步骤组成的工作流,其中每个步骤都可以返回一个好的或坏的结果。如果在任何步骤中发现不良结果,我们希望退出工作流程 - 并尽早退出!

我们通过在每一步(即函数)中有效地检查错误来解决它,但我不认为这是正确的方法 - 它效率低下,我们不会提前退出。

工作流中的示例函数如下:

let StepB stepAResult someParameters =
match stepAResult with
| Good(validResourceData) ->
// Do current step processing
// Return current step result
| Error(error) -> error |> Result.Error

工作流程本身如下所示:
let Workflow someParameters =
let stepAResult = StepA someParameters
let stepBResult = StepB stepAResult someParameters
let stepCResult = StepC stepBResult someParameters
let stepDResult = StepD stepCResult someParameters
stepDResult

所以每个示例函数都会接受前一个函数的结果,并且只有在没有错误的情况下才执行当前步骤!

我遇到的问题是,如果 StepA 因错误而失败,则仍会调用其他所有步骤。

是否有一种“提前返回”的“功能性”方式,而不是调用工作流中的每个函数,我们每次都必须检查错误?

最佳答案

你在假设下编写你的函数,一切都像你所做的那样顺利。然后你打开快乐的箱子并继续快乐的箱子。

最后,您可以使用构建器使语法更漂亮。

type Result<'TSuccess, 'TError> = 
| Success of 'TSuccess
| Error of 'TError

type ResultBuilder() =
member this.Bind(v, f) =
match v with
| Success v -> f v
| Error e -> Error e

member this.Return value = Success value

let result = ResultBuilder()

let bla<'a> = result {
let! successOne = Success 1
let! successTwo = Success 2
let! failure = Error "after this, the computation exited"
failwith "Boom, won't occurr"
return successOne + successTwo }

关于f# - 如何在 F# 中实现 "return early"逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com