Foldl在SML中返回一个元组?

时间:2012-03-15 16:44:04

标签: functional-programming sml smlnj

我正在处理的问题需要采用整数列表并返回这些数字的平均值。它需要适合看起来像这样的特定格式......

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)

1 个答案:

答案 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 *)