Foldl вернуть кортеж в SML? - PullRequest
       2

Foldl вернуть кортеж в SML?

3 голосов
/ 15 марта 2012

Проблема, над которой я работаю, должна взять список целых чисел и вернуть среднее значение этих чисел. Он должен соответствовать определенному формату, который выглядит следующим образом ...

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 Ответ

4 голосов
/ 15 марта 2012

Тип возврата 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 *)
...