Как вы разрабатываете и создаете свои монадические стеки? Впервые мне нужно построить монодичный стек (используя трансформаторы), чтобы решить проблему реального мира, но я не совсем уверен, в каком порядке складывать трансформаторы. Как вы уже знаете, до тех пор, пока вычисление имеет добрый * -> *
, в принципе все может играть роль внутренней монады в трансформаторе, таким образом, пара вопросов:
- Если какой-то конкретный трансформатор находится в верхней части стека (например, ReaderT? WriterT?)
- Что должно водить дизайн? Интуиция? Типы? (например, сформируйте стек в соответствии с вашими требованиями API)
- Является ли каждый стек изоморфным друг другу (в определенной степени), или это вероятно, что, если я создам свой стек неправильно, я могу закончить до невозможности использовать определенные базовые монады или иметь большой раздутый беспорядок
lift . lift . liftIO [...]
? Мое чувство кишки предполагает, что если трансформаторы получат некоторые экземпляры (например, MonadReader, MonadIO и т.д., Как и большинство трансформаторов вmtl
do), не имеет значения, в каком порядке я помещал трансформаторы.
Мне интересно услышать от опытных Haskellers о лучших практиках или эмпирических правилах.
forever $ print "Thanks!"
а.