SML/NJ中的高阶函数
我正在找人帮忙解决一个问题。我正在尝试编写一个函数,在ML中传递列表和函数。基本上,程序应该做的是获取一个列表,并通过函数运行每个元素。如果函数返回true,则元素将添加到列表中,并且在函数完成执行后返回列表。这是我的密码:SML/NJ中的高阶函数,sml,smlnj,ml,higher-order-functions,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
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)*));
任何帮助都将不胜感激
获取一个列表并通过函数运行每个元素。如果函数返回true,则元素将添加到列表中,并且在函数完成执行后返回列表
这正是内置函数。不需要重新发明轮子
获取一个列表并通过函数运行每个元素。如果函数返回true,则元素将添加到列表中,并且在函数完成执行后返回列表
这正是内置函数。无需重新发明轮子。几点提示:
- 在ML中几乎从不使用循环。任何时候需要迭代时,都要编写递归函数
- 您很少需要指定类型。在这种情况下,ML可以根据调用
的事实推断tl(x)
必须是一个列表x
- 与使用
和hd(x)
分解列表不同,您通常使用函数参数中的模式匹配来分解列表。将参数写成tl(x)
,而不是单个参数x::xs
x
将分配给列表的头部,而x
将分配给尾部xs
- 您可以使用不同的模式编写多个函数定义,而不是使用条件语句检查参数的结构(在本例中,无论列表是否为空)。ML将逐一尝试,直到找到适合的
- 函数体需要是一个计算结果为返回值的表达式。ML中的一切都是一个表达式;即使
本质上也是一个返回如果x那么a else b
或a
的函数b
fun select([], funct) = []
| select(x::xs, funct) = ...
此处的两种情况将替换您的while
条件-仅当您的列表为nil
时,才会计算第一种情况。第二种情况下的模式会自动为列表的开头和结尾指定值。该定义旨在递归select([],funct)=[]
是您的基本情况,select(x::xs,funct)=……
应该包括对select(xs,funct)
的调用一些指针:
- 在ML中几乎从不使用循环。任何时候需要迭代时,都要编写递归函数
- 您很少需要指定类型。在这种情况下,ML可以根据调用
的事实推断tl(x)
必须是一个列表x
- 与使用
和hd(x)
分解列表不同,您通常使用函数参数中的模式匹配来分解列表。将参数写成tl(x)
,而不是单个参数x::xs
x
将分配给列表的头部,而x
将分配给尾部xs
- 您可以使用不同的模式编写多个函数定义,而不是使用条件语句检查参数的结构(在本例中,无论列表是否为空)。ML将逐一尝试,直到找到适合的
- 函数体需要是一个计算结果为返回值的表达式。ML中的一切都是一个表达式;即使
本质上也是一个返回如果x那么a else b
或a
的函数b
fun select([], funct) = []
| select(x::xs, funct) = ...
此处的两种情况将替换您的while
条件-仅当您的列表为nil
时,才会计算第一种情况。第二种情况下的模式会自动为列表的开头和结尾指定值。该定义旨在递归select([],funct)=[]
是您的基本情况,select(x::xs,funct)=……
应该包括对select(xs,funct)
的调用