Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24

Монада с аккумулирующим значением

12.06.2013, 07:47. Показов 1221. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Не могу найти описание монады, которое когда-то видел. Я сейчас его опишу, может кто-нибудь узнает. Самостоятельно написать не могу, потому что не помню тонкостей "архитектуры".

Идея заключается в том, что если имеется некоторый моноид, то его значения можно использовать как значение-характеристику для проводимых вычислений, а его умножение — как склеивание двух таких значений в одно во время последовательного выполнения операций.

Архитектура вроде похожа на монаду состояний, то есть имеет вид либо Monoid s => s -> (a,s), либо Monoid s => (a,s), где a — аргумент монады, s фиксированный моноид.

Например, возьмём строки и конкатенацию в качестве s. Тогда мы можем как бы логировать наши вычисления, писать что-то в таком духе:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- a x^2 + b x + c = 0
findRoot :: Double -> Double -> Double -> AccMonad String [Double]
findRoot a b c = if a == 0
  then log "Not a square eq." >> return -c/b
  else let d = b*b - 4*a*c
    in do 
      log ("d="++show d)
      if d < 0 then ... else ...
main = do
  [a,b,c,_] <- fmap word getLine
  let root = findRoot a b c in
    putStr$ getLog root
    putStr "x="
    print$ getValue root
Другой пример: допустим я написал алгоритм Эвклида нахождения НОД
Haskell
1
2
3
4
gcd x y = case compair x y of
  EQ -> x
  LT -> gcd x (y-x)
  GT -> gcd (x-y) x
и хочу написать алгоритм, определяющий, какое количество шагов было сделано. Первое, что мне приходит в голову, — окружить это выражение такой монадой относительно Sum (моноид Int относительно сложения) и написать как-то так:
Haskell
1
2
3
4
gcd x y = case compair x y of
  EQ -> return x
  LT -> inc 1 >> return (gcd x (y-x))
  GT -> inc 1 >> return (gcd (x-y) x)
тут inc выполняет ту же функцию, что и log в предыдущем примере — добавляет в смысле моноидной операции аргумент к имеющемуся значению, которое мы аккумулируем.

Кто-нибудь помнит что-то подобное? Я определенно выдел, либо в библиотеках, либо на хабре.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2013, 07:47
Ответы с готовыми решениями:

Монада State на примере
Читал статью про монады Кирпичёва, в частности, застрял на монаде State (почти не понял) и программе с её участием. rand :: State...

Монада State на примере автоматов
Здравствуйте, помогите разобраться с монадой State, на примере автоматов. Автомат для разбора дробного числа, принимает состояние и...

Монада State, использование modify из другой функции
Это скелет программы. Это основная функция которая вызывает другие State mainCon = do acc &lt;- get put modify $...

1
 Аватар для Сtrl
144 / 134 / 8
Регистрация: 19.07.2011
Сообщений: 184
12.06.2013, 12:50
Монада Writer.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2013, 12:50
Помогаю со студенческими работами здесь

Как сделать чтобы монада Writer ничего не делала
Добрый день, уважаемые. Зашел в тупик: Есть такой код (проблемная строка - последняя, но привел целиком, хотя и прорядил немного). ...

Монада. Как лучше сделать программу, выборочно копирующую файлы?
доброго времени суток. вопрос.1. -недавно создавал тему &quot;Haskell - кто может писать на Haskel&quot; в разделе фриланс. тема, скорее...

Есть ли в хаскеле готовая монада, которая, получая на вход либо один элемент либо их список, конкатенирует это в себе
Добрый день. Есть ли в хаскеле готовая монада, которая может получать на вход либо один элемент либо их список и конкатенировать это в...

Удалить все элементы в массиве со значением E1, стоящие до элемента со значением E2 STL
Алгоритмы стандартной библиотеки шаблонов STL Дан одномерный массив, состоящий из N целых чисел. Удалить все элементы со значением E1,...

Добавить за каждым числом с наибольшим значением число с минимальным значением и наоброт.
если кто-нибудь сможет помочь, то помогите... 1. Даны целые числа a1,..an. Добавить за каждым числом с наибольшим значением число с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru