0

我做了这个代码:

let rec foo1 z = function
  | [] -> []
  | x::xs when x = z -> x::(foo1 x xs)
  | x::xs -> foo1 z xs

但我想要这个函数的更复杂版本,其中包含一个类型int -> int -> bool为第一个参数的新函数。此函数将针对列表的所有元素测试整数参数,应用运算符时产生 true 的元素应放置在返回列表中

例子:

let eq x y = x = y
let lt x y = x < y
let gt x y = x > y

foo2 eq 2 [1;2;4;2;5] => [2;2]
foo2 lt 2 [1;2;4;2;5] => [4;5]
foo2 gt 2 [1;2;4;2;5] => [1]
4

1 回答 1

4
/// Pass a function as an argument 
let rec filterByVal fn z = function 
    | [] -> [] 
    | x::xs when fn z x -> x::(filterByVal fn z xs) 
    | _::xs -> filterByVal fn z xs

/// Use anonymous functions
filterByVal (fun z x -> z = x) 2 [1;2;4;2;5] // [2; 2]
filterByVal (fun z x -> z < x) 2 [1;2;4;2;5] // [4; 5]
filterByVal (fun z x -> z > x) 2 [1;2;4;2;5] // [1]

/// Or use symbolic infix functions
filterByVal (=) 2 [1;2;4;2;5]
filterByVal (<) 2 [1;2;4;2;5]
filterByVal (>) 2 [1;2;4;2;5]
于 2012-11-27T12:57:51.463 回答