Я пытаюсь выяснить, как управлять несколькими ленивыми последовательностями из одной функции в F #.
Например, в приведенном ниже коде я пытаюсь получить две последовательности - одну, которая возвращает все файлы в каталогах, и другую, которая возвращает последовательность кортежей любых каталогов, к которым нет доступа (например,из-за разрешений) за исключением.
Хотя приведенный ниже код компилируется и запускается, errorSeq никогда не имеет никаких элементов при использовании другим кодом, хотя я знаю, что возникли исключения UnauthorizedAccess.
IЯ использую 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