【问题标题】:Higher Order Functions in SML/NJSML/NJ 中的高阶函数
【发布时间】:2012-02-04 22:11:01
【问题描述】:

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

非常感谢任何帮助。

【问题讨论】:

    标签: sml smlnj ml higher-order-functions


    【解决方案1】:

    几点建议:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-03-12
        • 2013-03-20
        • 1970-01-01
        • 2021-03-23
        • 2013-01-13
        • 2013-01-16
        • 2013-09-30
        • 2014-02-23
        • 2014-03-19
        相关资源
        最近更新 更多