【发布时间】:2017-08-11 10:58:03
【问题描述】:
想象一下下面的代码:
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
这符合我的预期。但是如果我们在函数中将 List 改为 Seq,我们会得到不同的行为:
let keys1 = seq { 1 .. 2 }
let keys2 = seq { 1 .. 3 }
let result1 = CollectionHasValidItems keys1 // true
let result2 = CollectionHasValidItems keys2 // true
这里使用 keys2 我可以在调试器的 values 对象中看到异常消息,但没有抛出异常...
为什么会这样?我的应用中需要一些类似的逻辑,并且更喜欢使用序列。
【问题讨论】:
-
这是因为序列的lazy evaluation。试试
let values = keys |> Seq.map (fun k -> d.Item k) |> Seq.toList。
标签: exception collections f# mapping sequences