|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||||||||
Монада State на примере14.07.2013, 15:24. Показов 4120. Ответов 16
Метки нет (Все метки)
Читал статью про монады Кирпичёва, в частности, застрял на монаде State (почти не понял) и программе с её участием.
0
|
||||||||
| 14.07.2013, 15:24 | |
|
Ответы с готовыми решениями:
16
Монада State на примере автоматов Монада State, использование modify из другой функции Монада с аккумулирующим значением |
|
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
|
||||||||||||||||||
| 14.07.2013, 19:37 | ||||||||||||||||||
0
|
||||||||||||||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
|||||||
| 14.07.2013, 22:59 [ТС] | |||||||
|
Кликните здесь для просмотра всего текста
Prelude> :l ./monteCarlo.hs
[1 of 1] Compiling Main ( monteCarlo.hs, interpreted ) monteCarlo.hs:9:8: Couldn't match type `RndGen' with `m0 Int' When using functional dependencies to combine MonadState s (StateT s m), arising from the dependency `m -> s' in the instance declaration in `Control.Monad.State.Class' MonadState (m0 Int) (StateT RndGen Data.Functor.Identity.Identity), arising from a use of `put' at monteCarlo.hs:9:8-10 In the expression: put In the expression: put $ RndGen ((x * 1367823 + 918237) `mod` 32768) >> return x monteCarlo.hs:9:8: Couldn't match type `()' with `Int' Expected type: StateT RndGen Data.Functor.Identity.Identity Int Actual type: StateT RndGen Data.Functor.Identity.Identity () In the expression: put $ RndGen ((x * 1367823 + 918237) `mod` 32768) >> return x In the second argument of `(>>=)', namely `\ (RndGen x) -> put $ RndGen ((x * 1367823 + 918237) `mod` 32768) >> return x' In the expression: get >>= \ (RndGen x) -> put $ RndGen ((x * 1367823 + 918237) `mod` 32768) >> return x monteCarlo.hs:9:14: Couldn't match expected type `m0 a0' with actual type `RndGen' In the return type of a call of `RndGen' In the first argument of `(>>)', namely `RndGen ((x * 1367823 + 918237) `mod` 32768)' In the second argument of `($)', namely `RndGen ((x * 1367823 + 918237) `mod` 32768) >> return x' Failed, modules loaded: none.
Сам генератор случайности образуется либо вручную: random (mkStdGen x) :: (Int, StdGen), либо main = do gen <- getStdGen ... и понеслась. Как-то так. В сигнатуре rand - RndGen - тип, т.к. идет с большой буквы, а что он в реализации get и put делает?
0
|
|||||||
|
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
|
||||||||||||||||||||||||||||||||||
| 15.07.2013, 02:32 | ||||||||||||||||||||||||||||||||||
Добавлено через 54 минуты Но, если нужно таки именно пристроить StdGen - есть функция random :: RandomGen g => g -> (a, g) которая фактически и есть монада состояния без прикрас, нам остается построить из нее значение типа State:
1
|
||||||||||||||||||||||||||||||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||
| 15.07.2013, 16:12 [ТС] | ||
|
хорошо, ни в случае с
0
|
||
|
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
|
|
| 15.07.2013, 17:19 | |
|
0
|
|
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||||||||||||||||
| 04.08.2013, 13:37 [ТС] | ||||||||||||||||
|
Я еще кое-что уразумел, что нужно для понимания данной монады:
1) постоянно держать перед носом её определение, припоминая про синтаксис записи из главы про создание АТД, который генерирует функции для извлечения полей:
2) и какой-нибудь несложный пример
Добавлено через 6 минут И последнее замечание, опять из викиучебника: Кликните здесь для просмотра всего текста
В последних (2.0.0.0 и выше) версиях пакета mtl изменилась реализация монады State , так что модуль Control.Monad.State больше не экспортирует конструктор State . Вам следует заменить, как в примерах, так и при написании вашего кода, этот конструктор функцией state :: (s -> (a, s)) -> State s a, которая делает ту же самую работу. Чтобы избежать привнесения некоторых дополнительных сложностей, мы пока будем придерживаться старой версии с конструктором. Вы ничего не пропустите вследствие этого, так как изменение реализации не повлияет на те вопросы, которые мы будем обсуждать.
0
|
||||||||||||||||
|
|
|
| 04.08.2013, 14:13 | |
|
serrr, по моей просьбе сделайте следующее:
1. Оформляйте код тегом HASKELL, а не более общим CODE. 2. Вы привели «чистую от монад» реализацию factorial. Попробуйте переписать её, используя явно аккумулятор, чтоб логика функции соответствовала логике fact'. 3. Перепишите fact' 0, не используя do-нотацию, сокращая и упрощая по-максимуму выражение, делая его более понятным. Можете не делать этого, если не хотите.
1
|
|
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||||
| 04.08.2013, 19:35 | ||||||||
|
Вот с пожеланием #3 Mysterious Light:
1
|
||||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||||||||||||
| 04.08.2013, 23:24 [ТС] | ||||||||||||
|
Mysterious Light,
1. Учту. 2. Как первый, так и второй пример с факториалом - не мои, я их просто привёл. С аккумулятором, говорите?
Nameless One, 3. Спасибо.
0
|
||||||||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
|||||||||||
| 12.08.2013, 21:54 [ТС] | |||||||||||
|
Nameless One или кто ещё может,
объясните, пожалуйста, что конкретно функция get с помощью оператора <- сбрасывает в переменную? Как это выглядит - в виде какого-то одного числа (значение результата или состояние) или кортежа? Например, в этом примере:
?
0
|
|||||||||||
|
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
|
||||||||||||
| 13.08.2013, 02:13 | ||||||||||||
|
Вообще
1
|
||||||||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||
| 13.08.2013, 15:39 [ТС] | ||
|
Дело в том, что: Чтение состояния. Это достигается с помощью get: get = state $ \st -> (st, st) Результирующий процессор состояния произведёт ввод st в обе позиции кортежа вывода - то есть, и как результат, и как состояние, для того, чтобы он мог бы связан с другими процессорами. Та же функция в развернутом (упрощенном) виде: get :: State s s get s = (s,s) -- например: get 1 -> (1,1) В примере с postincrement, неважно с сахаром или без, первоначальным состоянием за её пределами будет 1. Потом его получает get. Дальше что? Какая единица передается в переменную х? Потому что дальше последовательность процедур понятна, какая-то из единиц поступает в put, путем сложения, модифицирует результат к () и состояние к 2: (put (1+1)) 1 -> ((),2). Свой конечный результат ((),2) put дальше хоть и передаёт, но оператора return интересует значение из переменной x, и он видит, что благодаря put уже изменилось состояние 2, он берёт единицу из своей переменной x, изменившееся состояние, и заворачивает их в монаду. Чтобы их вытащить из монады State, в финале используется runState.
0
|
||
|
|
||||||||||||||||
| 13.08.2013, 17:00 | ||||||||||||||||
|
Делаю то, что попросил Вас calabi-yau, а именно расписываю всё по определению, принебрегая словами State и runState.
Даже если вместо get, которая является диагональю \s -> (s,s), поставить \s -> (s,undefined), получится одно и тоже. Можете сделать вывод о том, что только первая единица играет роль. Впрочем, все единицы ведь тождественны. Или нет?
1
|
||||||||||||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
| 13.08.2013, 17:21 | ||||||
|
serrr, нужно вспомнить определение State как монады и то, что do-нотация — это синтаксический сахар над монадами:
1
|
||||||
|
442 / 11 / 1
Регистрация: 08.01.2013
Сообщений: 28
|
||||||||
| 13.08.2013, 22:26 [ТС] | ||||||||
Всем спасибо. И ещё, очень хотелось бы знать, как вы оцениваете данную статью, которую я тут встретил: "Тройка полезных монад". Насколько корректна подача материала, можно ли по прочтении сразу же броситься в бой, если, допустим, раньше вы ничего не слышали про эти монады?
0
|
||||||||
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||
| 14.08.2013, 04:58 | ||
|
0
|
||
| 14.08.2013, 04:58 | |
|
Помогаю со студенческими работами здесь
17
Монада. Как лучше сделать программу, выборочно копирующую файлы? Нужен скрипт который разбирает данные как в примере, Нужно получить из данных таблицу по стандарту как в примере Есть ли в хаскеле готовая монада, которая, получая на вход либо один элемент либо их список, конкатенирует это в себе Паттерн State Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|