我是 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]]);
任何建议将不胜感激。谢谢!
最佳答案
使用 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
结构中使用一些内置的标准库函数,可以将这个函数减少到两行,包括空列表上的模式匹配。编辑 :
“平均一个整数列表的列表”有两种可能的含义。第一个是对每个列表求平均值,然后取平均值的平均值,第二个是将列表连接到一个长列表中,然后取整个列表的平均值。当所有整数列表的长度相同时,这两种方法是等效的(舍入误差除外),但如您的示例所示,它们不必具有相同的长度。
由于这是作业,我不打算直接给你答案,但请考虑以下内容,这可能会有所帮助:
关于function - SML NJ 的内部功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9388711/