2013-03-30 54 views
1

會有人請解釋爲什麼下面的代碼,應用列表元素的功能

let list = ["A"; "B"; "C"] 
    let rec processList2 aList str = 
     match aList with 
     | h::t -> let z = str + ", " + h 
        printfn "%s" z 
        processList2 t z 
     | [] -> aList |> ignore 

返回以下,

val list : string list = ["A"; "B"; "C"] 

> processList2 list "X";; 
X, A 
X, A, B 
X, A, B, C 
val it : unit =() 
> 

,而不是這個?

val list : string list = ["A"; "B"; "C"] 

> processList2 list "X";; 
X, A 
X, A, X, B 
X, A, X, B, X, C 
val it : unit =() 
> 

功能是遞歸的通行證「Z」,以「海峽」,每個通,所以它看起來像它應該工作...

我真的在這裏體會到專家的幫助。我正在努力學習F#並且努力學習列表。

另外,如何聲明一個'字符串列表?我有一個問題,其中列表預期會返回一個單位而不是一個字符串。

回答

2

如果我們每一步都跟着它應該幫助我們理解爲什麼你得到你所得到的結果:

processList2 list "X";; 

第一次迭代需要h::t"A"::["B"; "C"]。然後它將z設置爲"X" + ", " + "A"

下一次迭代需要"B"::["C"]。然後它將z設置爲"X, A" + ", " + "B"

正如你所見,"X"在每次迭代中都沒有插入。相反,z會被附加到最後的每個迭代構建中並進行設置。要在每次迭代追加"X"它需要是這樣的:

let list = ["A"; "B"; "C"] 
// Append "X, " to each item 
let mapList item = "X, " + item 
// reduce to single comma seperated list 
let redList l r = l + ", " + r  
// apply map and reduce functions to given list 
let result = list |> List.map(mapList) |> List.reduce(redList) 
printfn "%s" result 

如果你想你甚至可以使用的string.join然而,以減少列表,需要多幾個箍通過跳:

let list = ["A"; "B"; "C"] 
let mapList item = "X, " + item 
let joinList (lst:list<string>) = System.String.Join(", ", lst) 
let result = list |> List.map(mapList) |> joinList 
printfn "%s" result 

至於你最後一個問題:how does one declare a 'list of strings?,答案取決於你聲明的意思。你想要聲明一個該類型的變量或接受它的參數嗎?

將變量聲明爲某一類型,如果通常是這樣完成的:其中類型被聲明時:後給予let lst:string list = ["A"; "B"; "C"]。如果是在一個參數比你要多一點明確的是,你必須告訴您正在設置的參數類型的編譯器,而不是返回類型:

// Set the lst parameter type to be a list<string> (same as string list) 
let joinList (lst:list<string>) = System.String.Join(", ", lst) 

// fails as we are telling the compiler to expect a return of string list yet we are only returning string 
let joinList lst:list<string> = System.String.Join(", ", lst) 

// Explicitly set both return and parameters 
let joinList (lst:string list):string = System.String.Join(", ", lst) 

這通常不會被要求作爲類型F#中的推理系統非常好,在這種情況下計算出你想要/需要什麼類型。