Допустим, мы хотим использовать ReaderT [(a, b)]
вместо ] Может быть
монада, а затем мы хотим выполнить поиск в списке.
Теперь простой и не слишком необычный способ сделать это:
первая возможность
find a = ReaderT (lookup a)
Однако, похоже, что это утверждает некоторая нетривиальная вещь о том, как работает преобразователь ReaderT. Глядя на исходный код Control.Monad.Reader, становится ясно, что это работает нормально. Но я не читал никакой документации, подтверждающей это. Однако мы могли бы также написать поиск так:
вторая возможность
find a = do y <- ask
lift (lookup a y)
Подобные идеи справедливы для упаковки MaybeT
, StateT
, State
и Reader
. Обычно я пишу что-то вроде первого примера, но в большинстве случаев действительно очевидно, как написать это, как второй пример, и можно даже сказать, что это более читабельно. Итак, мой вопрос: следует ли считать код, подобный первому, плохим?