Как ввести значение Maybe в MaybeT - PullRequest
24 голосов
/ 31 декабря 2011

Скажем, у меня есть foo :: Maybe Int, и я хочу связать его, например, с bar :: Int -> MaybeT (Writer String) Int, какой бы идиотский способ сделать это?

Я мог бы определить свою собственную функцию liftMaybe, изатем используйте это, например:

let liftMaybe = maybe (fail "Nothing") return in liftMaybe foo >>= bar

Но есть ли более идиоматический (или хотя бы лаконичный) способ сделать это?

1 Ответ

23 голосов
/ 31 декабря 2011
MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a

Я думаю, это позор, что у него нет стандартного названия. Более общая форма

liftMaybe :: (MonadPlus m) => Maybe a -> m a
liftMaybe = maybe mzero return

, что предпочтительнее использования fail. Я бы просто положил его где-нибудь в удобный модуль.

Hayoo показывает большое разнообразие имен для этой функции; из них maybeZero мой любимый. liftMaybe, как это ни очевидно, не появляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...