问题描述
我有以下代码:
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 (将#修改为@)