我正在寻找有问题的帮助。我正在尝试编写一个在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)*));
非常感谢任何帮助。
答案 0 :(得分:4)
一些指示:
tl(x)
,x
必须是一个列表。hd(x)
和tl(x)
来分解列表。将参数写为x
,而不是单个参数x::xs
; x
将被分配到列表的头部,xs
将分配给尾部。if x then a else b
本质上是一个返回a
或b
。记住这一切,这里有一些东西可以让你开始:
fun select([], funct) = []
| select(x::xs, funct) = ...
此处的两个案例会替换您的while
条件 - 只有当您的列表为nil
时,才会评估第一个案例。第二种情况下的模式会自动将值分配给列表的头部和尾部。该定义旨在递归; select([],funct)=[]
是您的基本案例,select(x::xs,funct)=...
应该包含对select(xs,funct)
的调用。
答案 1 :(得分:1)
获取一个列表并通过该函数运行每个元素。如果函数返回true,则该元素将添加到列表中,并在函数执行完毕后返回列表。
这正是内置的List.filter功能。无需重新发明轮子。