2011-01-14 42 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 
     | [] -> [] 

do đó,Tôi muốn làm 2 việc sau khi một "sau đó" tuyên bố trong một "nếu .. sau đó .. khác" tuyên bố

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

những gì tôi muốn nói thêm là, nếu Câu lệnh "if" là đúng, không chỉ nó sẽ thực hiện "finalList @ [s]", mà còn "filtersList2fromList1 tl List2" để nó sẽ là đệ quy. Không thực thi "filtersList2fromList1 tl List2" khi đúng,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"] sẽ chỉ là ["x"], điều đó là sai.

Tôi nên giải quyết vấn đề này như thế nào?

Thank you very much

+1

định nghĩa của dolls_of là gì? –

+4

Tại sao bạn tạo 'finalList'? Nó hoàn toàn không làm gì cả. Hãy nhớ rằng các danh sách là không thay đổi, vì vậy 'finalList @ [s]' không thay đổi giá trị của 'finalList' nhưng trả về một danh sách mới. –

Trả lời

6

Để trả lời câu hỏi cụ thể của bạn, bạn có muốn sử dụng một dấu chấm phẩy hoặc một let...in xây dựng. Trong trường hợp của bạn, không phải sẽ làm những gì bạn muốn tuy nhiên.

Bạn nên đọc qua các tài liệu trên thư viện chuẩn, như các mô-đun List chứa mọi thứ bạn cần phải làm những gì bạn muốn:

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

Lưu ý rằng kể từ khi bạn đề cập đệ quy, tôi giả định rằng khi bạn đã viết dolls_of bạn có nghĩa là filtersList2fromList1. Ngoài ra, tôi giả định rằng List1List2 được coi là list1list2, vì lỗi trước đây sẽ là lỗi.

Cũng cần được chỉ ra rằng @ là hoạt động O(n) và bạn không nên sử dụng nó để xây dựng danh sách. Tuy nhiên như Niki đã chỉ ra trong các ý kiến, sử dụng của bạn finalList là vô nghĩa, vì vậy bạn không thực sự cần @ anyway.

Để trả lời câu hỏi của bạn: Bạn có thể thực hiện hai biểu thức này với nhau bằng cách tách chúng bằng ;. Tuy nhiên dolls_of là một chức năng không có tác dụng phụ, do đó, thực hiện nó mà không làm bất cứ điều gì với kết quả của nó sẽ làm cho ít ý nghĩa.

gì bạn thực sự muốn làm, như xa như tôi có thể nói, là:

if List.mem s list2 
then s :: filtersList2fromList1 tl list2 
else filtersList2fromList1 tl list2 
Các vấn đề liên quan