gpt4 book ai didi

f# - 我可以在 F# 中对选项检查进行分组吗

转载 作者:行者123 更新时间:2023-12-04 08:08:08 25 4
gpt4 key购买 nike

我有以下代码:

let i  = instrumentFromString arguments.[1]
let o = podManager.GetExchange().GetLeverageOptions(i.Value)
let l = parseInt arguments.[2] |> Option.bind (fun x -> if i.IsSome && o |> List.contains(x) then Some x else None)
let wl = parseDecimal arguments.[3] |> Option.bind (fun x -> if x > 0m && x <= 1m then Some x else None)
let ws = parseDecimal arguments.[4] |> Option.bind (fun x -> if x > 0m && x <= 1m then Some x else None)
它解析输入到系统中的命令。
然后是:
match i.IsSome && l.IsSome && wl.IsSome && ws.IsSome with
| true ->
... do stuff

| false ->
stringBuffer {
if i.IsNone then $"unkown instrument 'arguments.[1]'\n"
if l.IsNone && i.IsSome then $"invalid leverage, instrument '{i.Value.Ticker}' supports {podManager.GetExchange().GetLeverageOptions(i.Value)}\n"
if wl.IsNone then $"invalid long share, must be > 0 and <= 1\n"
if ws.IsNone then $"invalid short share, must be > 0 and <= 1\n"
}
我觉得这有点令人费解,因为我解析参数,然后验证它们,然后确保它们都没有问题,如果它们没有问题,我会再一次地检查它们。
所以一个选择是像这样转换解析行:
let l  = parseInt arguments.[2] |> Option.bind (fun x -> if i.IsSome && o |> List.contains(x) then Result.Ok x else Result.Error "my error message")
所以它会将测试和错误信息分组,但我仍然要检查是否有任何错误,然后再次解析可能的错误。
我猜一个计算表达式,我可以在其中累积 ok/error 值可以工作,但也存在 Option/Result 转换的问题。
是否有一些很好的惯用方法来处理我错过的这种情况?

最佳答案

我建议您将选项转换为结果并使用 validation FsToolkit.ErrorHandling 中的构建器。这使用 F# 5 语言功能。您可以在 F# 脚本中试用此代码:

#r "nuget: FsToolkit.ErrorHandling,2.0.0"
open FsToolkit.ErrorHandling

let a : Result<string, string> = Ok "a"
let b : Result<string, string> = Error "b missing"
let c : Result<string, string> = Ok "c"
let d : Result<string, string> = Error "d missing"

validation {
let! a = a
and! b = b
and! c = c
and! d = d
return a, b, c, d
}
// Returns: Error ["b missing"; "d missing"]
您应该能够将此示例应用于您的代码。

关于f# - 我可以在 F# 中对选项检查进行分组吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66117586/

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