Творческое использование монад - PullRequest
50 голосов
/ 05 января 2009

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

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

Ответы [ 8 ]

30 голосов
/ 09 января 2009

Фил Уодлер написал много работ по монадам , но читать первую - очень весело и будет доступно любому программисту; это называется Суть функционального программирования . Документ содержит исходный код и примеры использования.

Мой личный фаворит - монада вероятности ; если вы можете найти кандидатскую диссертацию Sungwoo Park , у нее есть несколько интересных примеров кодов робототехники.

16 голосов
/ 07 января 2009

Есть также LogicT (монадный трансформатор с возвратом в обратном направлении с честными операциями и отсечкой).

Он имеет хорошее значение для алгоритмов поиска AI, поскольку его конструкции для справедливых дизъюнкций, например, позволяют легко объединять вычисления, которые выполняются бесконечное число раз ( interleaved ).

Его использование описано в документе ICFP'05 Возврат, чередование и завершение монадных трансформаторов

13 голосов
/ 05 января 2009

Вы можете найти интересные и продвинутые монады в блоге Соседство Бесконечности . Я могу отметить Vector Space Monad и его использование для рациональных связок описания. К сожалению, я не думаю, что понимаю это достаточно хорошо, чтобы объяснить это здесь.

10 голосов
/ 06 января 2009

Одна из моих любимых монад * Поисковая монада Мартина Эскардо . Его можно найти на взломе в infinite-search упаковке .

Это монада «функций поиска» для набора элементов типа a, а именно (a -> Bool) -> Maybe a (поиск элемента в наборе, соответствующем данному предикату).

8 голосов
/ 16 мая 2009

Harpy , пакет для генерации машинного кода x86 во время выполнения, использует монаду генерации кода . Из описания:

Это комбинированная монада исключений состояния читателя, которая обрабатывает все детали обработки буферов кода, передачи двоичных данных, перемещения и т. Д.

Все функции генерации кода в модуле Harpy.X86CodeGen живут в этой монаде и используют ее средства сообщения об ошибках, а также внутреннее состояние, поддерживаемое монадой.

Пользователь библиотеки может передавать пользовательскую среду и пользовательское состояние через монаду. Это состояние не зависит от внутреннего состояния и может использоваться библиотеками генерации кода более высокого уровня для поддержания своего собственного состояния во время операций генерации кода.

Я нашел это особенно интересным примером, потому что я думаю, что этот шаблон не редкость: я сам изобрел нечто очень похожее для генерации набора внутренних сообщений для моего приложения на основе сообщений, полученных из (биржевых) биржевых данных , Оказывается, это чрезвычайно удобный способ иметь структуру, отслеживающую различные «глобальные» вещи, в то же время составляя простые операции, которые сами по себе не сохраняют состояния.

Я сделал еще один шаг к его идее о наличии пользовательского состояния (которое я называю «подсостоянием»), которое также можно передавать через монаду: у меня есть механизм для переключения и восстановления состояния во время монадного прогона:

-- | Given a generator that uses different substate type, convert it
-- to a generator that runs with our substate type. As well as the
-- other-substate-type generator, the caller must provide an initial
-- substate for that generator and a function taking the final substate
-- of the generator and producing a new substate of our type. This
-- preserves all other (non-substate) parts of the master state touched
-- by the generator.
--
mgConvertSubstate :: MsgGen msg st' a -> st' -> (st' -> st) -> MsgGen msg st a

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

8 голосов
/ 05 января 2009

Одно интересное использование монады в парсинге. Parsec - стандартный пример.

7 голосов
/ 05 января 2009

Прочитайте серию статей о монадах, используемых для моделирования вероятности и вероятностных процессов, здесь: http://www.randomhacks.net/articles/2007/03/03/smart-classification-with-haskell (перейдите по ссылкам на предыдущую / следующую часть)

5 голосов
/ 27 мая 2014

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

Перечисление и взвешенные поисковые монады

Монаду Omega можно использовать для продуктивного обхода бесконечных списков результатов. Сравните:

>>> take 10 $ liftM2 (,) [0..] [0..]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)]

>>> take 10 $ runOmega $ liftM2 (,) (each' [0..]) (each' [0..])
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]

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

Монада накопления ошибок

Полезный These тип данных образует Monad, аналогичный Either, но способный скорее накапливать ошибки. Пакет также определяет MonadChronicle класс , а также ChronicleT монадный трансформатор на основе These.

...