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

Накопитель для ленивых списков в Racket

Я определил простой ленивый список всех целых чисел с нуля:

(define integers-from
  (lambda (n) 
    (cons n
          (lambda () (integers-from (+ 1 n))))))

(define lz (integers-from 0))

Я также закодировал аккумулятор, который получает ленивый список в качестве параметра

(define lz-lst-accumulate
  (lambda (op initial lz)
    (if (null? lz)
        initial
        (cons (op (head lz) initial)  
              (lambda () (lz-lst-accumulate op (op initial (head lz)) (tail lz))))))) 

Отвечает ли этот аккумулятор формату ленивых списков? Вот простой тест аккумулятора:

(define acc (lz-lst-accumulate * 1 lz))
(take acc 4)
=> '(1 2 6 24)

take - вспомогательная функция, которая создает список из первых n элементов ленивого списка:

(define head car)

(define tail
  (lambda (lz-lst)
     ((cdr lz-lst)) ))

(define take
  (lambda (lz-lst n)
    (if (= n 0)
        (list)
        (cons (car lz-lst)
              (take (tail lz-lst) (sub1 n)))) ))

  • Пожалуйста, добавьте свои определения head, tail и take. 23.04.2014
  • @uselpa я добавил определения 23.04.2014

Ответы:


1

В вашем lz-lst-accumulate вы вычисляете один раз (op (head lz) initial), а затем также (op initial (head lz)). Это непоследовательно; оба должны быть одинаковыми и фактически рассчитываться только один раз, поскольку это одно и то же значение:

(define lz-lst-accumulate
  (lambda (op initial lz)
    (if (lz-lst-empty? lz)
        initial
        (let ((val (op (head lz) initial)))
           (cons val
              (lambda () (lz-lst-accumulate op val (tail lz))))))))

В вашем примере с числами он работает только потому, что вы используете симметричную операцию типа *. С cons это не сработает.

В остальном все нормально. lz-lst-accumulate обычно называется левый сгиб ( Фактически, scanl в Haskell, поскольку вы производите прогрессию «накопленных» значений, foldl f z xs = last (scanl f z xs)).


re: ваша версия take, это заставляет слишком много элементов потока. Лучше сделай это

(define take
  (lambda (lz n)
    (if (or (<= n 0) (lz-lst-empty? lz))
      (list)
      (if (= n 1)
        (list (car lz))      ; already forced
        (cons (car lz)
              (take (tail lz) (sub1 n)))))))

так что он вынуждает только столько элементов, сколько он должен произвести, а не еще один (который может быть, например, расходящимся, как (/ 1 0), что делает недействительным весь расчет без причины).

Таким образом, контрпример в SRFI 41 (из (take 4 (stream-map 1/ (ints-from-by 4 -1)))) будет работать (он вычисляет (1/4 1/3 1/2 1/1) без принуждения 1/0, что является обычной версией take, как и та, которую вы ' повторное использование, подойдет).

23.04.2014
  • можно сказать, я бы не стал работать с минусами? потому что я пробовал, и он работает, как ожидалось ... и большое спасибо за ваш ответ! 23.04.2014
  • с удовольствием, пожалуйста. :) Я имею в виду, что и (cons a b), и (cons b a) не могут дать одинаковых результатов. 24.04.2014
  • Новые материалы

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

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

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

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

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

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

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