写一个ML高阶函数philter(f,x,L),它取一个函数f和一个元素x,并返回列表L上所有那些元素y的列表,使f(x,y)=真。
Philter:(('a'* a')→bool * a'* a'list)→a'list
我的代码
fun filter p [] = [] | filter p (x::xs) =
if p x
then
x :: filter p xs
else
filter p xs;
filter (fn(x) => x<6) [6,3,0,1,8,5,9,3]; filter (fn(x) => x<6)
我有不同的val filter = fn :(&#39; a - &gt; bool) - &gt; &#39;列表 - &gt; &#39;列表
任何人都可以帮助我?
答案 0 :(得分:1)
你的函数只接受一个列表和一个函数作为参数,其中第三个参数,例如元素x
??
因此,您检查条件p x
而不是p(x,y)
,您的说明p
应该有类型:
(a'* a') -> bool
这是我的实施:
fun filter (p :('a * 'a -> bool) , _ ,[]) = []
| filter (p, x ,(y::ys))= if p (x,y) then y :: filter (p, x, ys)
else filter (p, x, ys);
这是一个尾递归实现:
fun filter2 (p : ('a * 'a -> bool), x, L)=
let
fun filter3 (p, _, [], L) = rev L
| filter3 (p, x, (y::ys), L) = if p (x,y) then filter3 (p, x, ys, (y::L))
else filter3 (p, x, ys, L);
in
filter3 (p, x, L, [])
end
示例(参见类型和结果):
val filter = fn : ('a * 'a -> bool) * 'a * 'a list -> 'a list
val filter2 = fn : ('a * 'a -> bool) * 'a * 'a list -> 'a list
val it = () : unit
- filter ((fn(x,y) => x<y), 4,[6,3,0,1,8,5,9,3]);
val it = [6,8,5,9] : int list
- filter2 ((fn(x,y) => x<y), 4,[6,3,0,1,8,5,9,3]);
val it = [6,8,5,9] : int list
答案 1 :(得分:0)
依靠内置List.filter
,您的philter
可能如下所示:
fun philter (f, x, L) = List.filter (fn y => f (x, y)) L