0

我正在寻求解决问题的帮助。我正在尝试编写一个在 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)*));

任何帮助将不胜感激。

4

2 回答 2

4

几点建议:

  • 你几乎从不在 ML 中使用循环。任何时候你需要迭代,写一个递归函数。
  • 您很少需要指定类型。在这种情况下,ML 可以根据您正在调用的事实推断出tl(x)x必须是一个列表。
  • 您通常不使用hd(x)tl(x)分解列表,而是在函数参数中使用模式匹配来执行此操作。而不是单个参数x,将参数写为x::xs; x将被分配到列表的头部和xs尾部。
  • 您可以编写具有不同模式的多个函数定义,而不是使用条件语句来检查参数的结构(在这种情况下,您的列表是否为空)。ML 会一一尝试,直到找到合适的。
  • 您的函数的主体需要是一个计算返回值的表达式。ML 中的一切都是表达式;evenif x then a else b本质上是一个返回aor的函数b

记住这一切,这里有一些东西可以帮助你开始:

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

这里的两种情况替换了您的while条件 - 只有当您的列表为时才会评估第一种情况nil。第二种情况下的模式会自动将值分配给列表的头部和尾部。这个定义是递归的;select([],funct)=[]是您的基本情况,select(x::xs,funct)=...应该包括对select(xs,funct).

于 2012-02-04T23:43:09.290 回答
1

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

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

于 2012-02-04T22:18:35.173 回答