1

如何找出列表类型所属的类?

https://www.haskell.org/onlinereport/haskell2010/haskellch6.html

数据 [a] = [] | a : [a] 推导 (Eq, Ord)

列表是类 Read、Show、Eq、Ord、Monad、Functor 和 MonadPlus 的实例。

为什么上面两个不完全一致?

列表类型是类的实例Foldable吗?如果是,为什么上面的链接中没有提到?

谢谢。

4

1 回答 1

3

为什么上面两个不完全一致?

这两种说法根本冲突。

[ Haskell'10deriving报告]意味着编译器将自动派生实例。因此,您不需要instance显式定义子句。该报告还指定了此自动实例的外观。

Haskell 报告提到只有有限数量的类型类可以自动派生:

CEq, 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,和这里的一个实例。EqOrdFunctor

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’
于 2019-07-27T13:22:18.180 回答