2012-03-15 72 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