想象一下下面的代码: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