我正在处理的问题需要采用整数列表并返回这些数字的平均值。它需要适合看起来像这样的特定格式......
fun average (n::ns) =
let
val (a,b) = fold? (?) ? ?
in
real(a) / real(b)
end;
我只允许更换问号,不能使用任何内置功能。我有一个有效的解决方案,但它不遵守这些规则。
fun average (n::ns) =
let
val (a,b) = ((foldl (fn(x, y)=>(x+y)) n ns), length(ns)+1)
in
real(a) / real(b)
end;
那么,有没有办法让折叠函数返回一个元组?这样的事情就是我想做的事情,但显然我不能这样做......
val (a,b) = ((foldl (fn(x, y)=>(x+y), count++) n ns)
答案 0 :(得分:4)
返回类型foldl
是初始累加器的类型。所以这里的想法是提供一个元组,包括列表中元素的总和和计数:
fun average (n::ns) =
let
val (a, b) = foldl (fn (x, (sum, count)) => (sum+x, count+1)) (n, 1) ns
in
real(a) / real(b)
end
请注意,如果列表为空,您的解决方案将失败,最好添加另一个处理空列表的情况(返回0.0或抛出自定义异常):
fun average [] = 0.0
| average (n::ns) = (* the same as above *)