在F#中编写我自己的List.filter版本

时间:2015-09-27 20:45:48

标签: f#

我试图手动重写List.filter 到目前为止我有这个:

let rec filter f = function
    |[] -> []
    |x::xs -> if f x = true then x @ filter f xs
              else filter f xs;;

2 个答案:

答案 0 :(得分:5)

我会在接受的答案中补充说,识别和应用功能模式可能与掌握递归和模式匹配同样重要。可能第一种模式是Example

使用折叠实现任务需要简洁:

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]

注意:这个函数不是尾递归的,所以你会得到大列表的堆栈溢出异常。