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"]
,这是错误的。
我该如何解决这个问题?
非常感谢
答案 0 :(得分:6)
要回答您的具体问题,您可以使用分号或let...in
构造。在你的情况下,两者都不会做你想要的。
您应该阅读标准库上的文档,因为List
模块包含了您需要的所有内容:
let filterList2fromList1 list1 list2 =
List.filter (fun x -> List.mem x list2) list1
答案 1 :(得分:4)
请注意,既然你提到了递归,我假设当你写dolls_of
时你的意思是filtersList2fromList1
。另外我假设List1
和List2
应该是list1
和list2
,因为前者会出错。
还应该指出@
是O(n)
操作,不建议使用它来构建列表。但是,正如Niki在评论中指出的那样,使用finalList
毫无意义,所以无论如何你实际上并不需要@
。
回答你的问题:你可以用;
分隔两个表达式。但是dolls_of
是一个没有副作用的函数,因此执行它而不对其结果做任何事情就没那么了。
据我所知,你实际想做的是:
if List.mem s list2
then s :: filtersList2fromList1 tl list2
else filtersList2fromList1 tl list2