【发布时间】:2022-01-27 16:02:00
【问题描述】:
假设我们有这个input:
let input =
[
"0.10"
"0.21"
"forty"
"5.32"
"q6.20"
]
将此输入映射到 F# 结果会导致 Result<'T,'TError> list:
open System
let output =
input
|> List.map (
fun s ->
match Decimal.TryParse s with
| true, i -> Ok i
| _ -> Error $"failed to parse `{s}`"
)
output |> printf "%A"
[Ok 0.10M; Ok 0.21M; Error "failed to parse `forty`"; Ok 5.32M;
Error "failed to parse `q6.20`"]
这是一种普遍接受的结果收集方式吗?
或者,是否存在对可伸缩性和性能的担忧,以至于整个列表只返回一个聚合结果?像Result<'T,'TError list> 这样的东西? FsToolkit.ErrorHandling [GitHub] 是否可以用于此功能,还是我错过了语言中的一种模式?
此解决方案是否会处理列表列表以避免返回 Result<Result<'T,'TError> list>, 'TError>?
【问题讨论】:
-
这有点取决于你的目标是什么。您可能想要
Results 的列表,或者您可能想要收集所有Ok元素并丢弃所有Error元素,或者您可能想要收集所有Ok元素,只要没有@ 987654334@s,在这种情况下只返回其中的第一个。以此类推。 -
您甚至可以“聚合/折叠/减少 OK,并列出连接错误”
标签: error-handling f#