我想使用一个有区别的联合来表示文件和目录。 然后给定一个目录我想列出其中的所有文件(递归)。
但是在List.iter makeFileList
我明白了:
类型不匹配。期待FileOrDir - >单位但给出了FileOrDir - >字符串列表。类型'单位'没有 匹配类型'字符串列表'
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
]
我很感激解释和解决方案。
答案 0 :(得分:5)
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)