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

Мемоизация для последующих фолд-коллов

Я ищу технику, которая позволяет запоминать между последующими вызовами сворачивания списков, которые добавляются в начало.

Я просмотрел библиотеку memoize, но, похоже, она не поддерживает мемоизацию функций высшего порядка, что имеет место для складок.

Я также попробовал эту технику с ленивой оценкой карты результатов, но безрезультатно.

Вот простой пример кода:

module Main where

import Data.Time

printAndMeasureTime :: Show a => a -> IO ()
printAndMeasureTime a = do
  startTime <- getCurrentTime
  print a
  stopTime <- getCurrentTime
  putStrLn $ " in " ++ show (diffUTCTime stopTime startTime)

main = do
  let as = replicate 10000000 1
  printAndMeasureTime $ foldr (-) 0 as -- just to resolve thunks
  printAndMeasureTime $ sum as
  printAndMeasureTime $ sum (1:as) -- recomputed from scratch, could it reuse previous computation result?
  printAndMeasureTime $ length (as)
  printAndMeasureTime $ length (1:as) -- recomputed from scratch, could it reuse previous computation result?

и вывод:

0
 in 1.125098223s
10000000
 in 0.096558168s
10000001
 in 0.104047058s
10000000
 in 0.037727126s
10000001
 in 0.041266456s

Времена подсказывают, что складки рассчитываются с нуля. Есть ли способ заставить последующие сгибы повторно использовать предыдущие результаты сгиба?

29.06.2018

  • Будьте осторожны с такими измерениями. Тот факт, что вы добавили ввод-вывод между объектами, которые хотите измерить, вполне мог заставить компилятор выдать для них другой код. Также обратите внимание, что запоминание всегда немного затруднительно; Если вам нужны такие вещи, сначала посмотрите, не можете ли вы кэшировать результаты в обычном режиме. 29.06.2018

Ответы:


1

Сделайте тип данных!

module List (List, _elements, _sum, _length, toList, cons) where

data List = List
  { _elements :: [Int]
  , _sum :: !Int
  , _length :: !Int
  }

toList :: [Int] -> List
toList xs = List xs (sum xs) (length xs)

cons :: Int -> List -> List
cons x (List xs t n) = List (x:xs) (x+t) (1+n)

Обратите внимание, что тип List экспортируется, а конструктор List - нет, поэтому единственный способ создать List - использовать функцию toList (обычно называемую «умным конструктором»).

01.07.2018
Новые материалы

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

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

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

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

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

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

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