ML高阶函数

时间:2017-10-14 11:29:47

标签: function sml

写一个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;列表

任何人都可以帮助我?

2 个答案:

答案 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