SML / NJ中的高阶函数

时间:2012-02-04 22:11:01

标签: sml smlnj ml higher-order-functions

我正在寻找有问题的帮助。我正在尝试编写一个在ML中传递列表和函数的函数。基本上程序应该做的是获取一个列表并通过该函数运行每个元素。如果函数返回true,则将元素添加到列表中,并在函数执行完毕后返回列表。这是我的代码:

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)*));

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

一些指示:

  • 你几乎从不在ML中使用循环。任何时候你需要迭代,写一个递归函数。
  • 您很少需要指定类型。在这种情况下,ML可以推断,因为您正在调用tl(x)x必须是一个列表。
  • 您通常使用函数参数中的模式匹配来执行此操作,而不是使用hd(x)tl(x)来分解列表。将参数写为x,而不是单个参数x::xs; x将被分配到列表的头部,xs将分配给尾部。
  • 您可以使用不同的模式编写多个函数定义,而不是使用条件语句来检查参数的结构(在这种情况下,列表是否为空)。 ML将逐个尝试它们,直到找到适合它的那个。
  • 您的函数正文需要是一个表达式,它会计算您的返回值。 ML中的 Everything 是一个表达式;偶数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)的调用。

答案 1 :(得分:1)

  

获取一个列表并通过该函数运行每个元素。如果函数返回true,则该元素将添加到列表中,并在函数执行完毕后返回列表。

这正是内置的List.filter功能。无需重新发明轮子。