2012-11-27 104 views
0

我有此代碼:運營商和列表F#

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
/// 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] 
+0

即我沒有不知道,你知道是否有辦法做同樣的事情,但沒有定義eq,lt和gt函數? – user1838768

+0

@ user1838768:看我的編輯。 – pad

+0

這隻能用整數來完成,還是可以做其他任何事情? – user1838768