gpt4 book ai didi

haskell - 在 ErrorT 之上为转换器定义 MonadPlus 实例

转载 作者:行者123 更新时间:2023-12-02 13:33:47 26 4
gpt4 key购买 nike

我想定义一个 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"]

最佳答案

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 法律。它很可能违反了其中的部分或全部!使用风险由您自行承担。

关于haskell - 在 ErrorT 之上为转换器定义 MonadPlus 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com