这个F#代码出了什么问题?

Pet*_*ter 1 f#

我想使用一个有区别的联合来表示文件和目录.然后给定一个目录我想列出其中的所有文件(递归).

但在线 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)

我会很感激解释和解决方案.

Bri*_*ian 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)
Run Code Online (Sandbox Code Playgroud)