![](/img/trans.png)
[英]How do I make a generic List which can accept two different, unrelated types?
[英]How can I find out the classes which list types belong to?
如何找出列表类型所属的类?
在https://www.haskell.org/onlinereport/haskell2010/haskellch6.html中说
数据[a] = [] | a:[a]导出(Eq,Ord)
和
列表是Read,Show,Eq,Ord,Monad,Functor和MonadPlus类的实例。
为什么上面两个不完全相同?
列表类型是Foldable
类的实例吗? 如果是,为什么上面的链接中没有提到?
谢谢。
为什么上面两个不完全相同?
这两个陈述完全没有冲突。
deriving
[Haskell'10报告]意味着编译器将自动派生实例。 因此,您无需显式定义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’
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.