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

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 或抛出自定义异常):
fun average [] = 0.0
  | average (n::ns) = (* the same as above *)

关于functional-programming - Foldl 在 SML 中返回一个元组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9724240/

10-13 07:08