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

时间:2009-11-21 22:19:02

标签: f#

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

但是在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                          
    ]            

我很感激解释和解决方案。

1 个答案:

答案 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)