【问题标题】:Defining MonadPlus instance for a transformer on top of ErrorT在 ErrorT 之上为变压器定义 MonadPlus 实例
【发布时间】:2012-12-18 19:59:46
【问题描述】:

我想定义一个 monad 转换器,除其他外,它赋予基本 monad 错误功能。如果基本 monad 是,则转换后的 monad 应该是 MonadPlus 的一个实例,但我不知道如何定义 MonadPlus 实例,以便 ErrorT 转换器返回多个答案(如果有多个答案)。我的两次尝试都在下面的代码中。在代码的末尾,有一个语句显示如果基本 monad 是 [],monad 转换器应该如何工作。谢谢。

import Control.Monad.Error
import Control.Monad.Trans.Class

data MyTrans m a = MyTrans {runMyTrans :: ErrorT String m a}

instance Monad m => Monad (MyTrans m) where
    return  = MyTrans . lift . return
    m >>= f = MyTrans $ do x <- runMyTrans m
                           runMyTrans (f x)

instance MonadTrans MyTrans where
    lift m = MyTrans $ lift m

instance MonadPlus m => MonadPlus (MyTrans m) where
    mzero = MyTrans $ lift mzero
    -- Attempt #1 (Only reveals the first element)
    m `mplus` n = MyTrans $ (runMyTrans m) `mplus` (runMyTrans n)
    -- Attempt #2 (Incomplete: see undefined statements)
--     m `mplus` n = MyTrans $
--                   lift $ do a <- runErrorT $ runMyTrans m
--                             b <- runErrorT $ runMyTrans n
--                             case a of
--                               Right r 1
--                               Left _ -> undefined
--                                   -> case b of
--                                        Left _ -> undefined
--                                        Right t -> return r `mplus` return t



type MyMonad = MyTrans []

x = return 1 :: MyMonad Int
y = MyTrans $ throwError "Error" :: MyMonad Int

z = x `mplus` y

main = do
  print $ (runErrorT $ runMyTrans z) -- should be [Right 1, Left "Error"] 

【问题讨论】:

  • 行尾的所有空格到底是怎么回事?

标签: haskell monads monad-transformers monadplus


【解决方案1】:
instance MonadPlus m => MonadPlus (MyTrans m a) where
    mzero = MyTrans (ErrorT mzero)
    MyTrans (ErrorT m) `mplus` MyTrans (ErrorT n) = MyTrans (ErrorT (m `mplus` n))

当心:我只验证了这符合您要求的行为,并没有检查它是否满足MonadPlus 法律。很有可能它违反了其中的部分或全部!使用风险自负。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2011-02-01
    • 2011-05-29
    • 2014-11-06
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多