我试图手动重写List.filter 到目前为止我有这个:
let rec filter f = function
|[] -> []
|x::xs -> if f x = true then x @ filter f xs
else filter f xs;;
答案 0 :(得分:5)
我会在接受的答案中补充说,识别和应用功能模式可能与掌握递归和模式匹配同样重要。可能第一种模式是。
使用折叠实现任务需要简洁:
let filter p ls = List.foldBack (fun l acc -> if p l then l::acc else acc) ls []
答案 1 :(得分:3)
运营商@
会附加2个列表,因此x
表达式中的if ... then ... else
应该是list
类型。
您可能打算使用list cons运算符::
。此外,您无需将函数f
应用程序的结果与true
进行比较。
let rec filter f = function
|[] -> []
|x::xs -> if f x then x :: filter f xs
else filter f xs
[1;2;3;4;5;6;7;8;9] |> filter (fun x -> x % 2 = 0)
val it:int list = [2; 4; 6; 8]
注意:这个函数不是尾递归的,所以你会得到大列表的堆栈溢出异常。