我想在“if ... then .. else”语句中的“then”语句之后做两件事

时间:2011-01-14 21:03:55

标签: list ocaml

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"]

我想补充的是,如果“if”语句为真,它不仅会执行“finalList @ [s]”,而且还会执行“filtersList2fromList1 tl List2”,这样它就会是一个递归。如果为真,则不执行“filtersList2fromList1 tl List2”,

filtersList2fromList1 ["x";"y";"z"] ["z";"x"]只会是["x"],这是错误的。

我该如何解决这个问题?

非常感谢

2 个答案:

答案 0 :(得分:6)

要回答您的具体问题,您可以使用分号或let...in构造。在你的情况下,两者都不会做你想要的。

您应该阅读标准库上的文档,因为List模块包含了您需要的所有内容:

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

答案 1 :(得分:4)

请注意,既然你提到了递归,我假设当你写dolls_of时你的意思是filtersList2fromList1。另外我假设List1List2应该是list1list2,因为前者会出错。

还应该指出@O(n)操作,不建议使用它来构建列表。但是,正如Niki在评论中指出的那样,使用finalList毫无意义,所以无论如何你实际上并不需要@

回答你的问题:你可以用;分隔两个表达式。但是dolls_of是一个没有副作用的函数,因此执行它而不对其结果做任何事情就没那么了。

据我所知,你实际想做的是:

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