为什么Either派生出Show但是Maybe不会?

gxt*_*lon 6 haskell show either maybe deriving

两者的文档EitherMaybe表明他们有实例Show.

Either被定义为派生Show,简单地说:

data  Either a b  =  Left a | Right b
  deriving (Eq, Ord, Read, Show, Typeable)
Run Code Online (Sandbox Code Playgroud)

然而,Maybe不是:

data  Maybe a  =  Nothing | Just a
  deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)

既然它们是一部分base并且如此相似,为什么不Maybe直接导出Show

另一个问题也可能是,它在哪里得到它的Show实例?

Tik*_*vis 10

实例for Maybe是明确定义的GHC.Show,以及一大堆其他常见类型(如元组)的实例.您可以使用以下:i命令找出实例的定义位置ghci:

Prelude> :i Maybe
data Maybe a = Nothing | Just a     -- Defined in ‘Data.Maybe’
instance Eq a => Eq (Maybe a) -- Defined in ‘Data.Maybe’
instance Monad Maybe -- Defined in ‘Data.Maybe’
instance Functor Maybe -- Defined in ‘Data.Maybe’
instance Ord a => Ord (Maybe a) -- Defined in ‘Data.Maybe’
instance Read a => Read (Maybe a) -- Defined in ‘GHC.Read’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
Run Code Online (Sandbox Code Playgroud)

我不知道为什么他们明确地定义了实例,或者把它放在 - GHC.Show而不是Data.Maybe- 据我所知,它可以被移动到Data.Maybe和/或派生.我的猜测是他们不想Data.Maybe依赖任何东西,除了GHC.Base(就像现在这样),大概是因为它被用在其他一些核心模块中.