想象一下下面的代碼:F# - 爲什麼Seq.map不會傳播異常?
let d = dict [1, "one"; 2, "two" ]
let CollectionHasValidItems keys =
try
let values = keys |> List.map (fun k -> d.Item k)
true
with
| :? KeyNotFoundException -> false
現在讓我們來測試一下:
let keys1 = [ 1 ; 2 ]
let keys2 = [ 1 ; 2; 3 ]
let result1 = CollectionHasValidItems keys1 // true
let result2 = CollectionHasValidItems keys2 // false
這個工程,我期望的那樣。但是,如果我們在函數改變列表以序列,我們得到不同的行爲:
let keys1 = seq { 1 .. 2 }
let keys2 = seq { 1 .. 3 }
let result1 = CollectionHasValidItems keys1 // true
let result2 = CollectionHasValidItems keys2 // true
這裏有keys2我可以看到內值對象在調試器,但沒有異常被拋出的異常的消息...
這是爲什麼?我需要在我的應用程序中使用類似的邏輯,並且傾向於使用序列。
這是因爲[懶惰評價](https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/lazy-computations)序列。試試'let values = keys |> Seq.map(fun k - > d.Item k)|> Seq.toList'。 – Funk