从任一提升到IO

The*_*ost 1 monads haskell

我想从Either monad转换为IO,而没有Either的任何线索。有更优雅的方法吗?

我已经编写了此函数,但是我想使用库或Prelude中的一些东西:

liftEither :: forall t (m :: * -> *) a. Monad m => (t -> m a) -> Either String t -> m a
liftEither f (Right a)  = f a
liftEither _ (Left msg) = fail msg
Run Code Online (Sandbox Code Playgroud)

Sib*_*ibi 5

使用either来自Data.Either以下功能的函数:

liftEither :: Monad m => (t -> m a) -> Either String t -> m a
liftEither f xs = either fail f xs
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

liftEither :: Monad m => (t -> m a) -> Either String t -> m a
liftEither = either fail
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我认为定义该功能甚至都不值得,因为它的功能名称并不明显,并且“两个失败”仅比“ liftEither”长一个字符。 (2认同)