2011-01-14 65 views
5
let rec filtersList2fromList1 (List1:string list) (List2:string list) : string list = 
let finalList = [] in 
match List1 with 
| s :: tl -> if List.mem s List2 = true 
then finalList @ [s] else filtersList2fromList1 tl List2 
     | [] -> [] 

,這樣,我想要做的兩件事情後,「然後」聲明在「如果..然後..否則」語句

filtersList2fromList1 ["x";"y";"z"] ["z";"x"] would be ["x";"z"] 
filtersList2fromList1 ["x";"y";"z"] ["x"] would be ["x"] 

我想,如果補充的是,是什麼「if」語句爲真,不僅會執行「finalList @ [s]」,還會執行「filtersList2fromList1 tl List2」,這樣它將成爲遞歸。在沒有執行「filtersList2fromList1 tl List2」的情況下,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"]只會是["x"],這是錯誤的。

我應該如何解決這個問題?

非常感謝您

+1

什麼是dolls_of的定義是什麼? – 2011-01-14 21:15:34

回答

6

爲了回答您的具體問題,你要麼使用一個分號或let...in結構。在你的情況下,不會做你想要的。

你應該通過對標準庫中的文檔閱讀,作爲List模塊包含你需要做你想要的一切:

let filterList2fromList1 list1 list2 = 
    List.filter (fun x -> List.mem x list2) list1 
4

注意,因爲你提到的遞歸,我假設當你寫dolls_of你的意思filtersList2fromList1。此外,我假設List1List2應該是list1list2,因爲前者將是一個錯誤。

還應該指出,@是一個O(n)操作,不建議使用它來建立列表。然而正如Niki在評論中指出的那樣,您使用finalList毫無意義,所以您實際上並不需要@

要回答你的問題:你可以通過用;分開它們來執行兩個表達式。然而dolls_of是一個沒有副作用的函數,所以執行它而不做任何事情的結果是沒有意義的。

你真正想要做的,據我所知,是:

if List.mem s list2 
then s :: filtersList2fromList1 tl list2 
else filtersList2fromList1 tl list2