2012-02-22 91 views
2

我是一个完整的新手,对于内部函数的语法有困难。我需要做的是获取一个int列表的列表,平均每个列表,并返回一个reals列表。这是迄今为止的伪代码。SML的内部函数NJ

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]]); 

任何意见将不胜感激。谢谢!

回答

5

使用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]; 

这是你的代码没有什么变化,除了重新排列顺序,并把该关键字letinend。如果这不是作业,我建议在List结构中使用一些内置的标准库函数,这可以将此函数减少为两行,包括空列表上的模式匹配。

编辑

有两种可能的含义为“平均INTS的名单列表。”首先是平均每个列表,然后取平均值,其次是将列表一起加入一个长列表中,并将整个列表的平均值加入整个列表。当所有int列表具有相同长度时,这两种方法是等价的(除了舍入错误),但正如您的示例所示,它们不必是相同的长度。

由于这是家庭作业,我不会直接给你答案,但是考虑到后面,这可能会有帮助:如果您使用“平均一个列表的第一个解释

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

问题是我需要平均列表的整数列表,即listAvg([[1,3,6,8,9],[4,2,6,5,1],[9 ,5,9,7],[5,4],[3,6,4,8]]);但这有很大帮助。谢谢! – MCR 2012-02-22 03:50:30