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

tak,chcę zrobić 2 rzeczy po "a następnie" oświadczenie w "if .. potem .. innego" oświadczenie

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

co chciałbym dodać to, że jeżeli "Jeśli" jest prawdziwe, to nie tylko wykonałoby "finalList @ [s]", ale także "filtersList2fromList1 tl List2", tak aby było rekursją. Bez wykonania "filtersList2fromList1 tl List2", gdy jest to prawdą, wartość parametru może wynosić tylko ["x"].

Jak powinienem rozwiązać ten problem?

Dziękuję bardzo

+1

Jaka jest definicja dolls_of? –

+4

Dlaczego tworzysz 'finalList'? Nie robi absolutnie nic. Należy pamiętać, że listy są niezmienne, więc 'finalList @ [s]' nie zmienia wartości 'finalList', ale zwraca nową listę. –

Odpowiedz

6

Aby odpowiedzieć na konkretne pytanie, można użyć średnika lub let...in konstrukt. W twoim przypadku żadne z nich nie zrobi tego, czego chcesz.

Należy zapoznać się z dokumentacją dotyczącą biblioteki standardowej, jak moduł List zawiera wszystko, czego potrzebujesz, aby robić to, co chcesz:

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

Zauważ, że skoro wspomniane rekursji, jestem przy założeniu, że kiedy pisał dolls_of chodziło filtersList2fromList1. Zakładam też, że List1 i List2 mają być list1 i list2, ponieważ pierwszy byłby błędem.

Należy również zauważyć, że @ jest operacją O(n) i nie jest zalecane używanie jej do tworzenia list. Jednak, jak zauważył Niki w komentarzach, twoje użycie finalList jest bezcelowe, więc tak naprawdę nie potrzebujesz @.

Aby odpowiedzieć na pytanie: Możesz wykonywać dwa wyrażenia po drugim, oddzielając je od ;. Jednak dolls_of jest funkcją bez efektów ubocznych, więc wykonanie jej bez zrobienia czegokolwiek z jej wynikiem byłoby mało sensowne.

Co ty właściwie chcesz zrobić, o ile mogę powiedzieć, to:

if List.mem s list2 
then s :: filtersList2fromList1 tl list2 
else filtersList2fromList1 tl list2 
Powiązane problemy