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

de manera que,Quiero hacer 2 cosas después de una instrucción "y luego" en un "si .. entonces .. otra cosa" declaración

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

lo que me gustaría añadir es, si el La instrucción "if" es verdadera, no solo ejecutará "finalList @ [s]", sino también "filtersList2fromList1 tl List2" para que sea una recursión. Sin ejecutar "filtersList2fromList1 tl List2" cuando es verdadero,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"] sería solamente ["x"], lo que es incorrecto.

¿Cómo debo resolver este problema?

Muchas gracias

+1

¿Cuál es la definición de dolls_of? –

+4

¿Por qué está creando 'finalList'? No está haciendo absolutamente nada. Tenga en cuenta que las listas son inmutables, por lo que 'finalList @ [s]' no cambia el valor de 'finalList', pero devuelve una nueva lista. –

Respuesta

6

Para responder a su pregunta específica, ya sea que le utiliza un punto y coma o una construcción let...in. En tu caso, ninguno hará lo que quieras sin embargo.

Debe leer a través de la documentación de la biblioteca estándar, como el módulo List contiene todo lo necesario para hacer lo que quiera:

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

Tenga en cuenta que ya que ha mencionado la recursividad, estoy asumiendo que cuando escribió que quería decir dolls_offiltersList2fromList1. También asumo que se supone que List1 y List2 son list1 y list2, ya que el primero sería un error.

También se debe señalar que @ es una operación y no se recomienda su uso para compilar listas. Sin embargo, como Niki señaló en los comentarios, su uso de finalList no tiene sentido, por lo que en realidad no necesita @ de todos modos.

Para responder a su pregunta: Puede ejecutar dos expresiones después de otra separándolas con ;. Sin embargo, dolls_of es una función sin efectos secundarios, por lo que ejecutarla sin hacer nada con su resultado tendría poco sentido.

Lo que realmente quiere hacer, por lo que yo puedo decir, es:

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