2012-02-04 68 views
0

我正在寻找有关问题的帮助。我正在尝试编写一个函数,它可以在ML中传递一个列表和函数。基本上,程序应该做的是获取一个列表并通过函数运行每个元素。如果函数返回true,那么元素将被添加到列表中,并且函数完成执行后返回列表。这里是我的代码:SML/NJ中的高阶函数

fun select(x:list, funct)=  (* Define a new function that accepts a list and the prime function as a parameter*) 
    while (tl(x) not nil) do(  (*While the tail is not empty*) 
      if funct(hd(x)) then (*Then run the function with the the head*) 
        val l = l::hd(x)  (*Adds the head of x to the list *) 
      (*else 1+tl(x)*)); 

任何帮助将非常感激。

回答

1

采取的列表,并通过运行该函数的每个元素。如果函数返回true,那么元素将被添加到列表中,并且函数完成执行后返回列表。

这正是内置的List.filter功能。没有必要重新发明轮子。

+0

'不需要重新发明轮子......除非它是作业;) – 2012-02-04 23:44:12

+0

是的,但是这个问题上没有作业标签:) – 2012-02-05 05:14:28

+0

对不起,我没有指定。这是一项家庭作业。 – mikeyGlitz 2012-02-09 14:53:29

4

几个要点:

  • 你几乎从来没有在ML使用循环。任何时候你需要迭代,写一个递归函数。
  • 你很少需要指定类型。在这种情况下,ML可以推断,从你打电话给tl(x)的事实,x必须是一个列表。
  • 除了使用hd(x)tl(x)来分解列表,您通常会在函数参数中使用模式匹配来执行此操作。将参数写为x::xs而不是单个参数x;将x分配给列表的头部,并将xs分配给尾部。
  • 而不是使用条件语句来检查你的论点的结构(在这种情况下,您的列表是否为空),你可以写不同的图案的多个函数定义。 ML会一个接一个地尝试,直到找到一个合适的。
  • 你的函数的主体必须是一个表达将计算得到的返回值。 ML中的一切是一个表达式;即使if x then a else b本质上也是一个返回ab的函数。

牢记这全都记在心里,这里的东西让你开始:

fun select([], funct) = [] 
| select(x::xs, funct) = ... 

两个案件在这里您更换条件while - 只有当你的列表nil,首先会进行评估。第二种情况下的模式会自动将值分配给列表的头部和尾部。该定义旨在递归; select([],funct)=[]是您的基本情况,并且select(x::xs,funct)=...应包含致电select(xs,funct)