До собственного туториала по монадам мне ещё расти и расти, а пока я решил поделиться прозрением, снизошедшим на меня по мере чтения нескольких глав «Learn You a Haskell for Great Good!»
В общем, оказалось, что пока я продирался сквозь «Real World Haskell» и пытался понять, как же на двух нещасных функциях — return и bind — можно в функционально чистом языке выполнять impure (так и хочется сказать «нечистый» :) код, я совершенно потерял общую картину. А на самом деле всё не так уж сложно.
Есть типы данных, как стандартные, так и пользовательские, определяемые с помощью ключевых слова data, type и newtype. Есть функции, с этими типами данных работающие.
Есть typeclasses, определяющие интерфейс (набор функций), который должны реализовывать все instances данного typeclass. Примеры: Eq (определяющий == и /=), Ord (min, max, <, <=, >=, > и т.п.) и, внезапно, Monad, определяющий те самые >>= и return. И всё, вот вам все монады.
То есть тайпклассы служат только для того, чтобы показать, что над определённым типом данных можно выполнять определённый набор функций. И так как монады — всего лишь ещё один typeclass, и ничего особенного в них нет.
Остальсь только выяснить, как же реализуется I/O и прочие сайд-эффекты :)
Minoru
01.08.2011 17:08 netbook
Do you really want to delete ?
s/нещасных/несчастных/ >_<
IO реализуется в IO; один из вариантов реализации — ST, в котором состоянием протаскивается RealWorld. но вообще монада IO в GHC — не лучший объект для изучения самой идеи