F# で単一の関数から複数の遅延シーケンスを管理する方法を理解しようとしています。
たとえば、以下のコードでは、2 つのシーケンスを取得しようとしています。1 つはディレクトリ内のすべてのファイルを返し、もう 1 つはアクセスできなかったディレクトリのタプルのシーケンスを返します (たとえば、パーミッションが原因で)例外。
UnauthorizedAccess 例外が発生したことはわかっていますが、以下のコードはコンパイルして実行されますが、他のコードで使用される場合、errorSeq には要素がありません。
F#2.0を使用しています。
#light
open System.IO
open System
let rec allFiles errorSeq dir =
Seq.append
(try
dir |> Directory.GetFiles
with
e -> Seq.append errorSeq [|(dir, e)|]
|> ignore
[||]
)
(try
dir
|> Directory.GetDirectories
|> Seq.map (allFiles errorSeq)
|> Seq.concat
with
e -> Seq.append errorSeq [|(dir, e)|]
|> ignore
Seq.empty
)
[<EntryPoint>]
let main args =
printfn "Arguments passed to function : %A" args
let errorSeq = Seq.empty
allFiles errorSeq args.[0]
|> Seq.filter (fun x -> (Path.GetExtension x).ToLowerInvariant() = ".jpg")
|> Seq.iter Console.WriteLine
errorSeq
|> Seq.iter (fun x ->
Console.WriteLine("Error")
x)
0