Functional programming Foldl是否在SML中返回元组?

Functional programming Foldl是否在SML中返回元组?,functional-programming,sml,smlnj,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), l

我正在研究的问题需要输入一个整数列表并返回这些数字的平均值。它需要适合这样的特定格式

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;
那么,有没有办法让fold函数返回元组呢?像这样的事情是我想要它做的,但显然我不能这样做

val (a,b) = ((foldl (fn(x, y)=>(x+y), count++) n ns)

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或引发自定义异常):


谢谢我明白你对空名单的看法了。除此之外,我现在得到了这个错误。。。错误:运算符和操作数不一致[重载]运算符域:('Z*int)*'Z->'Z操作数:('Z*int)*'Z->'Z*int@MCR:请参阅我的更新,我已更正了参数的顺序。谢谢。很好用,现在很有意义。
fun average [] = 0.0
  | average (n::ns) = (* the same as above *)