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
| [] -> []
Run Code Online (Sandbox Code Playgroud)
以便,
filtersList2fromList1 ["x";"y";"z"] ["z";"x"] would be ["x";"z"]
filtersList2fromList1 ["x";"y";"z"] ["x"] would be ["x"]
Run Code Online (Sandbox Code Playgroud)
我想补充的是,如果"if"语句为真,它不仅会执行"finalList @ [s]",而且还会执行"filtersList2fromList1 tl List2",这样它就会是递归.如果为真,则不执行"filtersList2fromList1 tl List2",
filtersList2fromList1 ["x";"y";"z"] ["z";"x"]只会是["x"],这是错误的.
我该如何解决这个问题?
非常感谢你
要回答您的具体问题,您可以使用分号或let...in结构.在你的情况下,两者都不会做你想要的.
您应该阅读标准库上的文档,因为该List模块包含您执行所需操作所需的一切:
let filterList2fromList1 list1 list2 =
List.filter (fun x -> List.mem x list2) list1
Run Code Online (Sandbox Code Playgroud)