我想使用一个有区别的联合来表示文件和目录.然后给定一个目录我想列出其中的所有文件(递归).
但在线 List.iter makeFileList
我明白了:
类型不匹配.期待FileOrDir - >单元,但给出了FileOrDir - >字符串列表.类型'unit'与'string list'类型不匹配
type FileOrDir =
| File of string
| Directory of string * FileOrDir list
let example = Directory("Directory1",[File("file1.txt"); File("file2.txt"); Directory("EmptyDir",[])])
let rec makeFileList fad =
[
match fad with
| File(name) -> yield name
| Directory(name,listOfFiles)
-> listOfFiles |> List.iter makeFileList
]
Run Code Online (Sandbox Code Playgroud)
我会很感激解释和解决方案.
List.iter采用一个没有返回值的函数('unit')并运行它的副作用.
我想你想要List.map,你想要"收益!" 结果.
哦,实际上你想要List.collect,它就像map,但是连接了所有的结果(每个都是一个列表).
请注意,'yield'将在序列中产生单个结果,而'yield!' 在序列中产生一系列结果.
编辑:
代码:
type FileOrDir =
| File of string
| Directory of string * FileOrDir list
let example =
Directory("Directory1",
[File("file1.txt");
File("file2.txt");
Directory("EmptyDir",[])])
let rec makeFileList fad =
[
match fad with
| File(name) -> yield name
| Directory(name,listOfFiles)
-> yield! listOfFiles |> List.collect makeFileList
]
printfn "%A" (makeFileList example)
Run Code Online (Sandbox Code Playgroud)