Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 09.10.2017
Сообщений: 16

Класс Monad

28.10.2017, 15:34. Показов 1729. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан следующий тип данных:
Haskell
1
data FunMonad a = FunMonad{ fun :: () -> a }
Необходимо для него реализовать класс Monad. И показать (на примерах) его работу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.10.2017, 15:34
Ответы с готовыми решениями:

Haskell Monad
При изучении Haskell, нашёл довольно интересное задание и пробую его выполнить, но возникли определённые проблемы. Суть задания состоит в...

Классы Functor, Applicative и Monad
Есть тип данных data FunMonad a = FunMonad { fun :: String -> a } и для него нужно реализовать классы Functor, Applicative и Monad. ...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template <class T> class matrix { friend class diagonal; ...

16
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
28.10.2017, 17:38
Цитата Сообщение от BeaverBean Посмотреть сообщение
Необходимо для него реализовать класс Monad
Если это необходимо Вам, то начните с того, что реализуйте класс Functor и покажите на примерах его работу.

P.S. поставлю отзыв -25% каждому, кто в этой теме выложит готовое решение перед ответом ТС.
1
28.10.2017, 18:32

Не по теме:

Цитата Сообщение от Mysterious Light Посмотреть сообщение
P.S. поставлю отзыв -25% каждому, кто в этой теме выложит готовое решение перед ответом ТС.
Вам привиделось что у Вас собственный киберфорум с BJ & ...

0
 Аватар для Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
29.10.2017, 01:41
Лучше просветите по поводу истории вопроса.
Текущая версия Haskell требует, чтобы для реализации Monad был реализован Functor.
Но некоторые примеры из сети заставляют думать, что ранее это было не так.
Так какая взаимосвязь Monad и Functor, так сказать, в динамике?
1
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
29.10.2017, 03:09
Case-Man,
ФП: Монады
Ответ на 14:50
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38174 / 21109 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 14
29.10.2017, 09:41
Цитата Сообщение от Case-Man Посмотреть сообщение
Текущая версия Haskell требует, чтобы для реализации Monad был реализован Functor.
-и по-моему, еще и Applicative
2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
29.10.2017, 10:22
По моим заблуждениям, Функтор для Монады требовался всегда (во всяком случае, в новейшей истории, ранний Палеозой не рассматриваем), а Аппликатив - с определенной версии либы. Потому что вроде как Монад появился раньше Аппликатива, а с появлением последнего пошло дублирование return/pure и т.п.

ЗЫ Mysterious Light, поставил вам плюс. Я уже давно думаю, что надо принимать какие-то активные меры по исправлению того безобразия, что здесь творится.

Не по теме:

ЗЗЫ KolodeznyDiver, форум таков, каким его делает администрация и участники. И если первая не желает делать его достойным, то вторые могу делать это в рамках своих скромных ограниченных возможностей. Имхо.

1
29.10.2017, 12:27

Не по теме:

_Ivana, не согласен. Правила устанавливает администрация, а не кто угодно, см. Самовольное модерирование, имхо, так же плохо как и самосуд.
Ладно, я тоже ввожу правило, но только для себя: самовольных модераторов не плюсую.

0
 Аватар для Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
30.10.2017, 03:07
Не поленился, раскопал старый тестовый проект для каких-то олайн-курсов с заданиями и их автоматической проверкой.
Поскольку тогда ещё очень слабо представлял монады, делал всё, как написано на сайте.
Точно помню, что чекер принял и успешно откомпилировал голый Monad, а у меня на компьютере ghc потребовал реализовать Functor.
С тех пор обновился - и сейчас тот же проект не компилируется, требует реализации Applicative

Так что зависимости нарастают..

И сразу вопрос гуру: если вдруг нет сил/времени/желания допиливать старый проект до рабочего состояния, есть ли возможность как-то откомпилировать его со старыми библиотеками?
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
30.10.2017, 05:10
Цитата Сообщение от Case-Man Посмотреть сообщение
есть ли возможность как-то откомпилировать его со старыми библиотеками?
я не гуру, но для этого придумали снимки пакетов в утилите stack(так же как и в пакетном менеджере nix). Там есть снимки с декабря 2014 года.
Обычно сделать экземпляры Funсtor и Applicative слишком легко, чтобы откатываться на старые библиотеки.
Потому что часто можно определить методы экземпляров Funсtor и Applicative из экземпляра Monad.
2
 Аватар для Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
30.10.2017, 05:14
Цитата Сообщение от XRuZzz Посмотреть сообщение
Обычно сделать экземпляры Funсtor и Applicative слишком легко
Это понятно, вопрос скорее гипотетический - вдруг когда-либо всплывёт более серьёзная несовместимость..
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
30.10.2017, 19:14
Цитата Сообщение от XRuZzz Посмотреть сообщение
Обычно сделать экземпляры Funсtor и Applicative слишком легко, чтобы откатываться на старые библиотеки.
+1. Функтор вообще дерайвится, а Аппликатив из монады делается пуре = ретурн, (<*>) = ап.

Хотя... аксакалы говорят, что бывают случаи, когда из монадического типа можно сделать не единственную реализацию Аппликатива, удовлетворяющую законам. Но она не будет семантически согласована с реализацией Монады.
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
30.10.2017, 19:42
Цитата Сообщение от _Ivana Посмотреть сообщение
Хотя... аксакалы говорят, что бывают случаи, когда из монадического типа можно сделать не единственную реализацию Аппликатива, удовлетворяющую законам. Но она не будет семантически согласована с реализацией Монады.
Ввиду этого я совершенно не понимаю, почему определение класса Monad не требует той самой согласованности с Functor и Applicative.

Не по теме:

А ТС-то не отвечает.

0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,550
Записей в блоге: 9
30.10.2017, 20:11
Цитата Сообщение от _Ivana Посмотреть сообщение
Функтор вообще дерайвится
Сенсеи говорят что для одного типа функторов можно понаделать что лепестков на цветущей сакуре. А по deriving получается всего лишь предполагаемый компилятором вариант ... а иногда ничего не получается.
Haskell
1
newtype Wrong a = Wrong (Either a Int) deriving Functor
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
30.10.2017, 20:50
Цитата Сообщение от Mysterious Light Посмотреть сообщение
почему определение класса Monad не требует той самой согласованности с Functor и Applicative.
Мне за себя стыдно. Конечно, согласованность требуется.

_Ivana, полагаю, имел в виду то, что подобно ретурну и апу fmap выражается
Haskell
1
fmap f xs  =  xs >>= return . f
Теперь вопрос: коль скоро Monad требует Application, который в свою очередь требует Function, и должны выполняться законы, то почему бы компилятору не автовывести инстансы тех двух на основе Monad? Он же умеет выводить >> на основе >>= же. Механизм вроде тот же.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
30.10.2017, 22:10
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Сенсеи говорят
Верно говорят. Но Функтор всяко проще Аппликатива, поэтому и заострять на нем внимание посчитал излишним.

Цитата Сообщение от Mysterious Light Посмотреть сообщение
почему бы компилятору не автовывести инстансы
Имхо, не компиляторское это дело - за модой библиотек гнаться. Сегодня у них одни классы типов, завтра другие... Сначала согласишься им сделать в синтаксисе (!) языка сахар для класса Монад (какие почести!) - лист (а с расширением и любой Монад) компрехеншенс и дунотацию, так потом они с этими монадами на шею сядут и будут заставлять Аппликативы и Функторы выводить. Нефиг, надо пресекать это дело.

Не по теме:

Цитата Сообщение от Mysterious Light Посмотреть сообщение
А ТС-то не отвечает.
А ТС получил по мордам наконец-то достойный ответ чуть ли не впервые на этом форуме, и пошел икать халявы в других местах.

0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
31.10.2017, 00:10
Цитата Сообщение от _Ivana Посмотреть сообщение
Имхо, не компиляторское это дело - за модой библиотек гнаться. [...] они с этими монадами на шею сядут и будут заставлять Аппликативы и Функторы выводить. Нефиг, надо пресекать это дело.
Я не о том. Дело компилятора, как впрочем и всего программирования, избавлять программиста от рутины.
Определение Monad звучит так:
Haskell
1
2
3
4
5
6
7
8
class Applicative m => Monad m where
    (>>=)       :: forall a b. m a -> (a -> m b) -> m b
    (>>)        :: forall a b. m a -> m b -> m b
    m >> k = m >>= \_ -> k
    return      :: a -> m a
    return      = pure
    fail        :: String -> m a
    fail s      = errorWithoutStackTrace s
Здесь требуется определить 4 функции, но только >>= и, если отказываемся от Applicative как было раньше, ещё return. Остальные, в частности, >>, выводятся.
Другой пример:
Haskell
1
2
3
4
5
6
7
8
9
class (Functor t, Foldable t) => Traversable t where
    traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
    traverse f = sequenceA . fmap f
    sequenceA :: Applicative f => t (f a) -> f (t a)
    sequenceA = traverse id
    mapM :: Monad m => (a -> m b) -> t a -> m (t b)
    mapM = traverse
    sequence :: Monad m => t (m a) -> m (t a)
    sequence = sequenceA
тоже 4 функции, из них достаточно задать только traverse или sequenceA.

Как мы видим, Haskell снимает с программиста необходимость имплементировать зависимые функции для каждого отдельно взятого типа.

Я спрашиваю, почему бы не расширить эту возможность до автоматической имплементации классов, которые упоминаются в зависимостях имплементируемого класса. Например, автоматический инстанс Applicative и Function конкретного типа на основе только инстанса Monad этого типа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.10.2017, 00:10
Помогаю со студенческими работами здесь

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Отдельно класс данных, класс формул и главный класс
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо
Создать класс колесо, имеющее радиус. Определить конструкторы. Создать класс машин, содержащий класс колесо. Дополнительно есть марка,...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число"
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru