使用这段代码
import Control.Monad
import Control.Applicative
import Control.Monad.State
class DefVal a where
defVal :: a
instance (DefVal a) => Alternative (Either a) where
empty = Left defVal
(Left _) <|> x = x
x <|> _ = x
instance (DefVal a) => MonadPlus (Either a) where
mzero = empty
mplus = (<|>)
newtype ErrString = ErrString { toString :: String }
deriving Show
instance DefVal ErrString where
defVal = ErrString "Default Error String"
我遇到了错误:
Duplicate instance declarations:
instance DefVal a => Alternative (Either a)
-- Defined at main.hs:10:10
instance Control.Monad.Trans.Error.Error e =>
Alternative (Either e)
-- Defined in ‘Control.Monad.Trans.Error’
Duplicate instance declarations:
instance DefVal a => MonadPlus (Either a)
-- Defined at main.hs:15:10
instance Control.Monad.Trans.Error.Error e => MonadPlus (Either e)
-- Defined in ‘Control.Monad.Trans.Error’
如果我删除导入Control.Monad.Trans.Error
的Control.Monad.State
,则错误消息消失。
我该如何导入Control.Monad.State
并隐藏其中的Control.Monad.Trans.Error
或隐藏Alternative
和MonadPlus
的Either
实例?
我使用的是GHC-7.10.2
。