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

in modo che,voglio fare 2 cose dopo un "poi" dichiarazione in un "se .. poi .. il resto" dichiarazione

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

quello che vorrei aggiungere è che, se il "if" è vera, non solo eseguirà "finalList @ [s]", ma anche "filtersList2fromList1 tl List2" in modo che sia una ricorsione. Senza eseguire "filtersList2fromList1 tl List2" quando è vero,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"] sarebbe solo ["x"], che è errato.

Come devo risolvere questo problema?

La ringrazio molto

+1

Qual è la definizione di dolls_of? –

+4

Perché stai creando 'finalList'? Sta facendo assolutamente nulla. Tieni presente che le liste sono immutabili, quindi 'finalList @ [s]' non modifica il valore di 'finalList' ma restituisce una nuova lista. –

risposta

6

Per rispondere alla tua domanda specifica, che ci sia di utilizzare un punto e virgola o un costrutto let...in. Nel tuo caso, nessuno dei due farà quello che vuoi comunque.

Si dovrebbe leggere attraverso la documentazione sulla libreria standard, come il modulo List contiene tutto il necessario per fare ciò che si vuole:

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

Nota che, dal momento che lei ha citato la ricorsione, sto supponendo che quando hai scritto dolls_of volevi dire filtersList2fromList1. Suppongo anche che List1 e List2 debbano essere list1 e list2, poiché il primo sarebbe un errore.

Va inoltre sottolineato che @ è un'operazione O(n) e non è consigliabile utilizzarlo per creare elenchi. Tuttavia, come Niki ha sottolineato nei commenti, l'uso di finalList non ha senso, quindi non è necessario in ogni caso lo @.

Per rispondere alla domanda: è possibile eseguire due espressioni dopo l'altra separandole con uno ;. Tuttavia, dolls_of è una funzione senza effetti collaterali, quindi l'esecuzione senza fare nulla con il suo risultato non avrebbe molto senso.

cosa si vuole realmente fare, per quanto posso dire, è:

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