gxt*_*lon 6 haskell show either maybe deriving
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
(就像现在这样),大概是因为它被用在其他一些核心模块中.