【问题标题】:F# Iterate a Seq of KeyValuePair and print all Key, Values. Then failwithf if the list is not emptyF# 迭代 KeyValuePair 的 Seq 并打印所有 Key、Values。如果列表不为空,则失败
【发布时间】:2017-10-03 12:36:02
【问题描述】:

我有一个 KeyValuePair 序列,我想打印所有键和值,然后如果列表不为空且变量值为 true (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# functional-programming sequence seq


    【解决方案1】:

    F# 中的序列是惰性的:它们只会在必要时遍历尽可能多的元素。某些操作需要获取序列的所有元素,例如Seq.toList。但是Seq.map 不是其中之一:当您执行Seq.map 时,您仍然有一个尚未经过任何元素的惰性序列。而Seq.isEmpty 只会遍历 一个 元素,因为这就是证明序列不为空所需要的全部内容。

    您可能想要将Seq.isEmpty 替换为Seq.toList |> List.isEmpty。然后你最终会遍历所有元素。另请注意,您最终将遍历所有元素无论您的failOnError 值是否为真。如果您想在failOnError 为假的情况下打印键和值,那么您应该更改if 语句的顺序:if failOnError && not (seq |> Seq.toList |> List.isEmpty)

    【讨论】:

    • 嗨@rmunn 感谢您提供完整的答案和提供的有关 F# Seq 的背景信息,我现在看到了问题,您的建议可以解决问题:)
    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2014-08-17
    相关资源
    最近更新 更多