Nano Hash - криптовалюты, майнинг, программирование

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;

Итак, есть ли способ заставить функцию fold возвращать кортеж? Что-то вроде этого - это то, что я хочу сделать, но, очевидно, я не могу этого сделать...

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

Ответы:


1

Тип возвращаемого значения 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 *)
15.03.2012
  • Спасибо. Я понимаю, что вы говорите о пустом списке. Кроме того, теперь я получаю эту ошибку... Ошибка: оператор и операнд не согласуются [перегрузка] домен оператора: ('Z * int) * 'Z -> 'Z операнд: ('Z * int) * 'Z -> 'Z * инт 15.03.2012
  • @MCR: смотрите мое обновление, я исправил порядок аргументов. 15.03.2012
  • Спасибо. Отлично работает и теперь имеет большой смысл. 15.03.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..