F#迭代KeyValuePair的序列并打印所有键、值。如果列表不为空,则使用F失败

F#迭代KeyValuePair的序列并打印所有键、值。如果列表不为空,则使用F失败,f#,functional-programming,sequence,seq,F#,Functional Programming,Sequence,Seq,我有一个KeyValuePair的序列,我想打印所有的键和值,然后如果列表不是空的并且变量值为true,我想失败(failOnError) 我的尝试如下,但在第一次迭代打印1 KeyValuePair后总是失败 Seq.map(fun kvp -> printfn "Key: %s" kvp.Key printfn "Value: %s" kvp.Value kvp) |> fun s

我有一个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#中的序列是懒惰的:它们只会根据需要迭代尽可能多的元素。有些操作需要获取序列的所有元素,如
Seq.toList
。但是
Seq.map
不是其中之一:当您执行
Seq.map
时,您仍然有一个尚未遍历任何元素的惰性序列。而
Seq.isEmpty
将只迭代一个元素,因为这就是证明序列不是空的全部条件

您可能需要将
Seq.isEmpty
替换为
Seq.toList |>List.isEmpty
。然后,您将遍历所有元素。还要注意的是,不管您的
failOnError
值是否为true,您最终都会遍历所有元素。如果您只想在
failOnError
为false时打印键和值,那么您应该更改
If
语句的顺序:
If failOnError&¬(seq |>seq.toList |>List.isEmpty)
F#中的序列是惰性的:它们只会根据需要迭代尽可能多的元素。有些操作需要获取序列的所有元素,如
Seq.toList
。但是
Seq.map
不是其中之一:当您执行
Seq.map
时,您仍然有一个尚未遍历任何元素的惰性序列。而
Seq.isEmpty
将只迭代一个元素,因为这就是证明序列不是空的全部条件


您可能需要将
Seq.isEmpty
替换为
Seq.toList |>List.isEmpty
。然后,您将遍历所有元素。还要注意的是,不管您的
failOnError
值是否为true,您最终都会遍历所有元素。如果只想在
failOnError
为false时打印键和值,则应更改
If
语句的顺序:
If failOnError&¬(seq |>seq.toList |>List.isEmpty)

Hi@rmunn感谢您提供的完整答案和F#Seq的背景信息。我现在看到问题,您的提案完成任务:)Hi@rmunn感谢您提供的完整答案和F#Seq的背景信息。我现在看到问题,您的提案完成任务:)