SML/NJ中的高阶函数

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

我正在找人帮忙解决一个问题。我正在尝试编写一个函数,在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)*));
任何帮助都将不胜感激

获取一个列表并通过函数运行每个元素。如果函数返回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)
的调用