【问题标题】:Inner Functions With SML NJSML NJ 的内部函数
【发布时间】:2012-03-12 10:07:14
【问题描述】:

我是 sml 的完全新手,并且在内部函数的语法方面遇到了问题。我需要做的是获取一个整数列表的列表,平均每个列表,并返回一个实数列表。这是我到目前为止的伪代码。

 fun listAvg [] = 0  
    else (sum (x) div size (x))

        fun sum[] = 0
        | sum(head::rest)= head + sum rest;


        fun size [] = 0
        | size(head::rest) = 1 + size rest;

    listAvg([[1,3,6,8,9], [4,2,6,5,1], [9,5,9,7], [5,4], [3,6,4,8]]); 

任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: function syntax functional-programming sml


    【解决方案1】:

    使用 let,如

    fun listAvg [] = 0  
      | listAvg x =
        let
            fun sum[] = 0
              | sum(head::tail)= head + sum tail;
            fun size [] = 0
              | size(head::tail) = 1 + size tail;
         in
             (sum x) div (size x)
         end
    

    您必须将 int list 传递给此函数,例如

    listAvg [1, 2, 3, 4];
    

    这对您的代码没有任何更改,除了重新排列顺序并放置关键字let、in 和end。如果这不是功课,我建议在List 结构中使用一些内置的标准库函数,可以将这个函数减少到两行,包括空列表上的模式匹配。

    编辑:

    “平均一个整数列表的列表”有两种可能的含义。第一个是对每个列表进行平均,然后取平均值,第二个是将列表连接成一个长列表,并对整个列表取平均值。当所有整数列表的长度相同时,这两种方法是等效的(舍入错误除外),但如您的示例所示,它们不必具有相同的长度。

    由于这是家庭作业,我不会直接给你答案,但请考虑以下内容,这可能会有所帮助:

    • 如果您使用“平均一个整数列表的列表”的第一种解释:有一个内置的 SML 函数可以让您将另一个函数应用于列表的每个元素,并获得结果列表.这可能有助于获得单个平均值,然后您可以将它们组合成一个整体平均值。
    • 如果您使用第二种解释:有一个内置的 SML 函数(它看起来像一个运算符,但 SML 中许多看起来像运算符的东西只是中缀函数)将两个列表连接在一起,并且一个内置的 SML 函数,用于将函数应用于列表中的元素以及累加器值,以生成单个值。您也许可以使用这两个函数创建一个包含所有数字的长列表,然后您可以对其进行平均。

    【讨论】:

    • 问题是需要我对一个整数列表的列表进行平均,即 listAvg([[1,3,6,8,9], [4,2,6,5,1] , [9,5,9,7], [5,4], [3,6,4,8]]);但这有很大帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 2013-09-30
    • 2014-02-23
    • 1970-01-01
    • 2014-03-19
    • 2016-02-02
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多