如何找出列表类型所属的类?
在https://www.haskell.org/onlinereport/haskell2010/haskellch6.html说
数据 [a] = [] | a : [a] 推导 (Eq, Ord)
和
列表是类 Read、Show、Eq、Ord、Monad、Functor 和 MonadPlus 的实例。
为什么上面两个不完全一致?
列表类型是类的实例Foldable
吗?如果是,为什么上面的链接中没有提到?
谢谢。
为什么上面两个不完全一致?
这两种说法根本不冲突。
[ Haskell'10deriving
报告]意味着编译器将自动派生实例。因此,您不需要instance
显式定义子句。该报告还指定了此自动实例的外观。
Haskell 报告提到只有有限数量的类型类可以自动派生:
C是
Eq
,Ord
,Enum
,Bounded
,Show
, 或之一Read
。
某些ghc
扩展允许更多自动派生的类型类(如Functor
等)。
除了 Haskell 可以自动派生的那个之外,您还可以使用instance
块 [Haskell'10 报告]手动实例化其他的。
例如,我们可以定义Maybe
自己:
data Maybe a = Nothing | Just a deriving (Show, Eq, Ord)
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)
因此,我们的Maybe
类型是Show
,和这里的一个实例。Eq
Ord
Functor
在ghci
中,您可以使用:i
来找出一个类型属于哪些类型类,例如:
Prelude> :i []
data [] a = [] | a : [a] -- Defined in ‘GHC.Types’
instance Eq a => Eq [a] -- Defined in ‘GHC.Classes’
instance Monad [] -- Defined in ‘GHC.Base’
instance Functor [] -- Defined in ‘GHC.Base’
instance Ord a => Ord [a] -- Defined in ‘GHC.Classes’
instance Read a => Read [a] -- Defined in ‘GHC.Read’
instance Show a => Show [a] -- Defined in ‘GHC.Show’
instance Applicative [] -- Defined in ‘GHC.Base’
instance Foldable [] -- Defined in ‘Data.Foldable’
instance Traversable [] -- Defined in ‘Data.Traversable’
instance Monoid [a] -- Defined in ‘GHC.Base’