SML NJ的内部函数

MCR*_*MCR 3 syntax functional-programming function sml

我是一个完全新手的sml,我的内部函数的语法有问题.我需要做的是获取一个int列表的列表,平均每个列表,并返回一个reals列表.这是我到目前为止的伪代码.

 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]]); 
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*cin 6

使用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
Run Code Online (Sandbox Code Playgroud)

你必须传递int list给这个功能,例如

listAvg [1, 2, 3, 4];
Run Code Online (Sandbox Code Playgroud)

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

编辑:

"平均一个整体列表列表"有两种可能的含义.第一个是平均每个列表,然后取平均值的平均值,第二个是将列表一起加入一个长列表,并取整个列表的平均值.当所有的整数列表具有相同的长度时,这两种方法是等效的(舍入误差除外),但正如您的示例所示,它们不必具有相同的长度.

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

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