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

问题描述

我有以下代码:

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 转换的问题。

是否有一些很好的惯用方法来处理我错过的这种场景?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)