трансформеры монад. Локально, работая в монаде StateT Integer (Writer (Sum Integer)) забыл сделать лифтинг для функции tell из Writer, однако всё заработало и без лифтинга. Как можно понять, почему в новой версии языка так получается?
посмотрите на тип tell
tell :: MonadWriter w m => w -> m (). Раньше не видел такого класса
Возможно, предполагается, что StateT должен приходить из пакета transformers, а у вас из mtl
вот поэтому и работает. потому что через класс MonadWriter другие трансформеры могут "переносить" свойства Writer
Спасибо. Буду разбираться с этим классом
да там всё тупенько. Writer реализует MonadWriter так, как в вашем учебнике написано. а остальные — всего лишь передают управление следующей монаде в стопке
вообще, mtl — индустриальный стандарт, можно сказать, так что всё нормально
То есть лучше его, чем import Control.Monad.Trans ?
Кстати говоря, в моём учебнике есть MonadWriter) Просто я до него ещё не дошёл и перепутал импорты
Обсуждают сегодня