Подтвердить что ты не робот

Как вставить значение Maybe в MaybeT

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

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

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

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

4b9b3361

Ответ 1

MaybeT . return :: (Monad m) => Maybe a -> MaybeT m a

Я считаю, что стыдно, что у него нет стандартного имени. Более общий вид

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

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

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