2012-03-15 38 views
3

我正在处理的问题需要采取整数列表并返回这些数字的平均值。它需要适应,看起来像这样的特定格式...Foldl在SML中返回一个元组?

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) 

回答

4

foldl返回类型为初始accummulator的类型。所以,这里的想法是提供包括列表中的元素的总和计数一个元组:

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 *) 
+0

谢谢。我明白你对空单的看法。除此之外,我现在得到这个错误...错误:操作符和操作数不一致[过载]操作符域:('Z * int)*'Z - >'Z 操作数:('Z * int )*'Z - >'Z * int – MCR 2012-03-15 17:08:06

+0

@MCR:看到我的更新,我纠正了参数的顺序。 – pad 2012-03-15 17:11:49

+0

谢谢。工作很好,现在有很多意义。 – MCR 2012-03-15 17:19:32