ML 高阶函数

约书亚

编写一个 ML 高阶函数 philter(f,x,L),它接受一个函数 f 和一个元素 x,并返回列表 L 上所有这些元素 y 的列表,使得 f(x,y) = true。

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 : ('a -> bool) -> 'a list -> 'a list

任何人都可以帮助我吗?

编码器

您的函数只需要一个列表和一个函数作为参数,其中第三个参数例如 element 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章