Cómo inyectar un valor Maybe en MaybeT


Digamos que tengo algo foo :: Maybe Int y quiero enlazarlo, por ejemplo, con bar :: Int -> MaybeT (Writer String) Int, ¿cuál sería la forma idiomática de hacerlo?

Podría definir mi propia función liftMaybe, y luego usarla, como:

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

¿Pero hay una forma más idiomática (o al menos concisa) de hacer eso?

Author: user1078763, 2011-12-31

1 answers

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

Creo que es una pena que no tenga un nombre estándar. Una forma más general es

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

Que es preferible al uso de fail. Lo pondría en un módulo conveniente en algún lugar.

Hayoo muestra una amplia variedad de nombres para esta función; de ellos, maybeZero es mi favorito. liftMaybe, tan obvio como es, no aparece.

 20
Author: ehird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-26 18:00:16