Я хочу сделать 2 вещи после оператора "then" в операторе "if .. then .. else" - PullRequest
5 голосов
/ 15 января 2011
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"]

Я хотел бы добавить, что если выражение «если» истинно, оно будет выполнять не только «finalList @ [s]», но также «filtersList2fromList1 tl List2», чтобы оно было рекурсией. Без выполнения «filtersList2fromList1 tl List2», когда оно истинно,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"] будет только ["x"], что неправильно.

Как мне решить эту проблему?

Большое спасибо

Ответы [ 2 ]

6 голосов
/ 15 января 2011

Чтобы ответить на ваш конкретный вопрос, вы должны использовать точку с запятой или конструкцию let...in.В вашем случае, однако, ни один из них не будет делать то, что вы хотите.

Вы должны прочитать документацию по стандартной библиотеке, так как модуль List содержит все, что вам нужно, чтобы делать то, что вы хотите:

let filterList2fromList1 list1 list2 =
  List.filter (fun x -> List.mem x list2) list1
4 голосов
/ 15 января 2011

Обратите внимание, что поскольку вы упомянули рекурсию, я предполагаю, что когда вы писали dolls_of, вы имели в виду filtersList2fromList1.Также я предполагаю, что List1 и List2 должны быть list1 и list2, поскольку первое будет ошибкой.

Следует также указать, что @O(n) операция, и не рекомендуется использовать ее для создания списков.Однако, как указал Ники в комментариях, использование finalList бессмысленно, поэтому вам все равно не нужно @.

Чтобы ответить на ваш вопрос: вы можете выполнять два выражения за другим, разделяяих с ;.Однако dolls_of - это функция без побочных эффектов, поэтому выполнение ее без каких-либо действий с ее результатом не имеет большого смысла.

На самом деле, насколько я могу судить, вы действительно хотите сделать:

if List.mem s list2   
then s :: filtersList2fromList1 tl list2
else filtersList2fromList1 tl list2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...