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