F#从一个方法管理多个惰性序列?

F#从一个方法管理多个惰性序列?,f#,sequences,F#,Sequences,我试图弄明白如何从F#中的单个函数管理多个惰性序列 例如,在下面的代码中,我尝试获取两个序列-一个返回目录中的所有文件,另一个返回任何目录的元组序列(例如,由于权限),但有例外 当下面的代码编译并运行时,errorSeq在被其他代码使用时从来没有任何元素,即使我知道发生了未经授权的访问异常 我使用的是F#2.0 #灯 开放系统 开放系统 让rec allFiles errorSeq dir= 附后 (试试看 dir |>Directory.GetFiles 具有 e->Seq.append er

我试图弄明白如何从F#中的单个函数管理多个惰性序列

例如,在下面的代码中,我尝试获取两个序列-一个返回目录中的所有文件,另一个返回任何目录的元组序列(例如,由于权限),但有例外

当下面的代码编译并运行时,errorSeq在被其他代码使用时从来没有任何元素,即使我知道发生了未经授权的访问异常

我使用的是F#2.0

#灯
开放系统
开放系统
让rec allFiles errorSeq dir=
附后
(试试看
dir |>Directory.GetFiles
具有
e->Seq.append errorSeq[|(dir,e)|]
|>忽略
[||]
)
(试试看
迪尔
|>Directory.GetDirectories
|>Seq.map(所有文件错误Seq)
|>序号:concat
具有
e->Seq.append errorSeq[|(dir,e)|]
|>忽略
序号:空
)
[]
让主参数=
printfn“传递给函数的参数:%A”参数
设errorSeq=Seq.empty
allFiles errorSeq参数。[0]
|>Seq.filter(fun x->(Path.GetExtension x).ToLowerInvariant()=“.jpg”)
|>Seq.iter Console.WriteLine
errorSeq
|>序号:iter(乐趣x->
Console.WriteLine(“错误”)
十)
0

Seq.append
返回一个新序列,因此

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

没有效果。也许您希望函数返回两个序列的元组?或者使用某种可变集合在遇到错误时写入错误?

Seq.append
返回一个新序列,因此

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

没有效果。也许您希望函数返回两个序列的元组?或者使用某种可变集合在遇到错误时写入错误?

如果您想采用更实用的方法,这里有一种方法:

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

现在,我们每次都将错误序列和文件序列传递到函数中,并返回通过在函数中附加它们而创建的新序列。不过,我认为在这种情况下,命令式方法更容易遵循。

如果您想采用更实用的方法,这里有一种方法:

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

现在,我们每次都将错误序列和文件序列传递到函数中,并返回通过在函数中附加它们而创建的新序列。不过,我认为在这种情况下,命令式方法更容易遵循。

您肯定不是说会发生AccessViolationException(),对吧?@Gabe,不是,我是说UnauthorizedAccessException。编辑了问题。你肯定不是说AccessViolationException()发生了吧?@Gabe,不是,我是说UnauthorizedAccessException。编辑了问题。是的,使用标准的
列表
可能是这里最容易做的事情。列表确实允许轻松报告错误。这在F#中是相当标准的,还是有更“惯用”的方法?我还试图实现另一个建议(返回序列的元组),但我还没有想出如何实现它。是的,在这里使用标准的
列表
可能是最简单的事情。列表确实允许轻松报告错误。这在F#中是相当标准的,还是有更“惯用”的方法?我还试图实现另一个建议(返回序列的元组),但我还没有想出如何实现它。