Какая задача программирования обеспечила ваш прорыв с монадами?

В недавнем сообщении в блоге о вероятной монаде, которую он написал, Марк Доминус написал: "Итак, я чувствую, что, наконец, я пришел, монадием."

Моя первая монадическая программа была неудобным решением для Проблема 32 от Project Euler с помощью parsec и Возможно, монада.

На чем вы работали, когда свет, наконец, включился для вас? Предоставьте хотя бы эскиз написанного вами кода. Зная, что вы знаете сейчас, как бы вы его улучшили и почему?

Ответ 1

Когда я понял, что могу использовать монаду для синтаксического анализа и для интерпретации, я смог написать свой первый мини-интерпретатор для LUA-подобного динамического языка программирования в F # с первой попытки. Первоклассные продолжения!, среда, изменчивое состояние, отладка - всего лишь большой блок трансформатора монады.

Ответ 2

Это не совсем кошерный ответ на ваш вопрос, потому что это не задача программирования, но Learn You A Haskell идет от Functors к Применителям к Монадам ясным способом, который мне очень помог.

Ответ 3

Некоторая база данных случайных вычислений при выборке. Тип "m a" является случайной величиной типа "a" и "a → m b" является "случайной функцией". Случайные переменные очень просто обрабатываются таким образом. "ReplicateM n" используется для получения независимых образцов из одной и той же переменной.

Обозначения тоже прекрасны: x < - y означает, что x - это выборка из случайной величины y.

Ответ 4

Ничего. Через несколько месяцев, не пытаясь понять монады и делать другие вещи, в следующий раз, когда я подумал о монадах, я заметил, что понял их. (Это имеет тенденцию происходить в других областях.)

Для записи наиболее полезной была идея с точки зрения объединения, а не ( → =), и осознание того, что join (:: m (ma) → ma) в основном говорит "вместо вычисления A, которое Я могу запустить для вычисления B (который я могу запустить, чтобы получить значение типа a), дать мне новое вычисление C, которое запускает как A, так и B в одном шаге", так что это очень похоже на "run" 'функции любой Монады, которую вы используете, всего на один уровень вверх. С помощью fmap вы можете производить вычисления типа m (m (m (m (m (ma))))), с соединением вы можете сгладить их назад, а вместе вы можете создавать произвольные последовательности вычислений (и 'return' - это тривиальное вычисление). Секвенциальность - это суть, которую захватывает Монада.

Ответ 5

Для меня это создавало вариацию в Модификации QuickCheck "Gen" (которая используется для создания случайных значений). Я хотел проверить что-то состояние, поэтому я переписал "Gen" в качестве монадного трансформатора и уложил его в монаду штата. Где-то там лампочка продолжалась.