代码之家  ›  专栏  ›  技术社区  ›  Nathan

从一个方法管理多个延迟序列?

  •  0
  • Nathan  · 技术社区  · 14 年前

    我正试图找出如何从f_中的一个函数管理多个惰性序列。

    例如,在下面的代码中,我尝试获取两个序列-一个返回目录中的所有文件,另一个返回任何目录的元组序列,而这些目录在异常情况下无法访问(例如由于权限)。

    当下面的代码编译并运行时,当被其他代码使用时,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
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Brian    14 年前

    Seq.append

    Seq.append errorSeq [|(dir, e)|] 
    |> ignore 
    [||] 
    

        2
  •  3
  •   kvb    14 年前

    let rec allFiles (errorSeq, fileSeq) dir  = 
      let files, errs =
        try 
          Seq.append (dir |> Directory.GetFiles) fileSeq, errorSeq
        with 
          e -> fileSeq, Seq.append [dir,e] errorSeq 
      let subdirs, errs =
        try
          dir |> Directory.GetDirectories, errs
        with
          e -> [||], Seq.append [dir,e] errs
      Seq.fold allFiles (errs, files) subdirs