Какая задача программирования обеспечила ваш прорыв с монадами?
В недавнем сообщении в блоге о вероятной монаде, которую он написал, Марк Доминус написал: "Итак, я чувствую, что, наконец, я пришел, монадием."
Моя первая монадическая программа была неудобным решением для Проблема 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" в качестве монадного трансформатора и уложил его в монаду штата. Где-то там лампочка продолжалась.