2009-11-21 149 views
1

我想使用歧視聯盟來表示文件和目錄。 然後給出一個目錄,我想列出其中的所有文件(遞歸)。這個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       
    ]    

我希望雙方的解釋和解決方案。

回答

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) 
+0

TX,這可以解釋爲什麼打印此形成鮮明對比沒有問題,在這裏列出的理解。你能給我提供一個代碼示例嗎?我只是剛開始學習。 – Peter 2009-11-21 22:28:06