2017-05-05 13 views
0

我有KeyValuePair的序列,我想打印的所有鍵和值之後,我要失敗,如果該列表不爲空並且變量值爲true(failOnError)。F#迭代KeyValuePair的Seq並打印所有Key,Values。然後failwithf如果列表不爲空

我的嘗試如下,但在第一次迭代打印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" 

任何想法?

回答

3

F#中的序列是lazy:它們只會根據需要循環訪問儘可能多的元素。某些操作需要獲取序列的所有元素,如Seq.toList。但Seq.map不是其中之一:當你做Seq.map時,你仍然有一個懶惰的序列,還沒有經過任何元素。而且Seq.isEmpty只會遍歷一個元素,因爲這就是證明序列不是空的所需要的。

你可能想要的是與Seq.toList |> List.isEmpty更換Seq.isEmpty。然後你會最終迭代所有的元素。請注意,您最終將遍歷所有元素,無論您的failOnError值是否爲爲真。如果您想打印鍵和值只有如果failOnError是假的,那麼你應該改變你的if語句的順序:if failOnError && not (seq |> Seq.toList |> List.isEmpty)

+0

嗨@rmunn感謝完整的答案和F#序列所提供的背景我現在看到的問題和你的建議做的事情:) – Diego

相關問題