次のコードを想像してみて: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
これは動作します。しかし、我々は関数内で配列にリストを変更した場合、我々は異なる動作を取得:keys2とここ
let keys1 = seq { 1 .. 2 }
let keys2 = seq { 1 .. 3 }
let result1 = CollectionHasValidItems keys1 // true
let result2 = CollectionHasValidItems keys2 // true
私は、デバッガで値オブジェクト内の例外メッセージを見ることができますが、例外がスローされません...
なぜこのようなのですか?私は私のアプリでいくつかの同様のロジックが必要とシーケンスで動作することを好むだろう。
シーケンスの[遅延評価](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