F# 迭代 KeyValuePair 的 Seq 并打印所有键、值。如果列表不为空则 failwithf
F# Iterate a Seq of KeyValuePair and print all Key, Values. Then failwithf if the list is not empty
我有一个 KeyValuePair 序列,我想打印所有键和值,然后如果列表不为空且变量值为真 (failOnError),我想失败。
我的尝试如下,但它总是在第一次迭代打印 1 个 KeyValuePair 后失败。
Seq.map(fun kvp ->
printfn "Key: %s" kvp.Key
printfn "Value: %s" kvp.Value
kvp)
|> fun seq ->
if not (Seq.isEmpty seq) && failOnError
then
failwithf "There is Errors see above messages"
有什么想法吗?
F# 中的序列是 惰性的:它们只会根据需要迭代尽可能多的元素。有些操作需要获取序列的所有元素,例如 Seq.toList
。但是 Seq.map
不是其中之一:当您执行 Seq.map
时,您仍然有一个尚未遍历任何元素的惰性序列。 Seq.isEmpty
只会遍历 一个 元素,因为这就是证明序列不为空所需的全部内容。
您可能想要用 Seq.toList |> List.isEmpty
替换 Seq.isEmpty
。然后您将最终遍历所有元素。另请注意,无论 是否 您的 failOnError
值是否为真,您最终都会遍历所有元素。如果您想在 failOnError
为 false 时仅 打印键和值,那么您应该更改 if
语句的顺序:if failOnError && not (seq |> Seq.toList |> List.isEmpty)
。
我有一个 KeyValuePair 序列,我想打印所有键和值,然后如果列表不为空且变量值为真 (failOnError),我想失败。
我的尝试如下,但它总是在第一次迭代打印 1 个 KeyValuePair 后失败。
Seq.map(fun kvp ->
printfn "Key: %s" kvp.Key
printfn "Value: %s" kvp.Value
kvp)
|> fun seq ->
if not (Seq.isEmpty seq) && failOnError
then
failwithf "There is Errors see above messages"
有什么想法吗?
F# 中的序列是 惰性的:它们只会根据需要迭代尽可能多的元素。有些操作需要获取序列的所有元素,例如 Seq.toList
。但是 Seq.map
不是其中之一:当您执行 Seq.map
时,您仍然有一个尚未遍历任何元素的惰性序列。 Seq.isEmpty
只会遍历 一个 元素,因为这就是证明序列不为空所需的全部内容。
您可能想要用 Seq.toList |> List.isEmpty
替换 Seq.isEmpty
。然后您将最终遍历所有元素。另请注意,无论 是否 您的 failOnError
值是否为真,您最终都会遍历所有元素。如果您想在 failOnError
为 false 时仅 打印键和值,那么您应该更改 if
语句的顺序:if failOnError && not (seq |> Seq.toList |> List.isEmpty)
。