[英]Relation Between the Different Types in Haskell
根据我的理解,Haskell中有4种“类型”:
data
代数数据类型 data
类型中的=
之后=
在技术上不是类型,我不认为) type
class
instance
键入instance
问题是:
data
类型和class
类型类之间有什么区别。 它们看似相似,但显然它们有一些不同的特征。 与(3)相同。 data
类型和instance
类型类实例之间的区别是什么。 我是Haskell的新手。
data
和newtype
引入新的类型(或类型构造实际上- Maybe
不是一个类型的,但Maybe a
是任何类型的a
是一个类型)。
data
声明引入了一种新类型( =
的左侧)和表示该类型数据的方式( =
的右侧)。
例如,如果您有这样的数据声明:
data SomeType = SomeConstructor
然后你引入了一个名为SomeType
的新类型,以及一种构造SomeType
值的SomeType
,即构造函数SomeConstructor
(顺便SomeConstructor
,它没有任何参数,因此是唯一存在于此类型中的值)。
一个类型类没有做任何的这些事情(而且也没有一个instance
)。 类型类引入了一个约束和一堆多态函数,如果满足该约束,它们应该是可用的。 instance
基本上是通过为这些函数提供实现来说“此类型满足此约束”。 因此, class
不是真正引入新类型,它只是为现有类型提供ad-hoc多态的一种方法。
例如, Show
类型类大致是这样的:
class Show a where -- a is an instance of Show if
show :: a -> String -- it has a function called show with this signature
(请注意,实际Show
类Prelude
并不完全是这样的)
show
now的类型为Show a => a -> String
,您可以将其读作
所有人的,如果他们满足约束
Show
(或者,如果他们的实例Show
),这是一个函数,它的a
并返回一个字符串
这样的实例看起来像这样
instance Show SomeType where
show SomeConstructor = "SomeConstructor"
意思是
SomeType
满足约束Show
,我将通过提供show
的实现向您show
这大致是它的要点。 有一些语言扩展允许类型类和实例发生更多相关事情,但您现在不需要担心。
你可能听说过种 ,它们是“类型的类型”在Haskell的。 类型是具有类型*
东西,它表示可以具有值的东西:
> :kind Int
Int :: *
> :kind Char
Char :: *
类型构造函数是具有类型的东西* -> *
; 类型构造函数接受一种类型(某种类型*
)并返回另一种类型。
> :kind Maybe
Maybe :: * -> *
> :kind []
[] :: * -> *
应用类型构造函数会为您提供一种新的类型*
:
> :kind Maybe Int
Maybe Int :: *
> :kind [] Float
[] Float :: *
(解析器允许[Foo]
作为[] Foo
的特例。)
还有其他类型的东西。 其中之一是Constraint
,您使用约束构造函数(也称为类型类)创建Constraint
。 给一个约束构造函数一个类型,然后你得到一个约束。
> :kind Show
Show :: * -> Constraint
> :kind Show Int
Show Int :: Constraint
> :kind Show (Int -> Char)
Show (Int -> Char) :: Constraint
(注意,即使没有定义Int -> Char
实例,后者也是正确的。)
在这种情况下, =>
看起来像一个运算符,而不仅仅是特殊的语法。 它的参数是约束的“列表”(尽管使用普遍量化的类型变量而不是具体类型)和类型,其返回值是“约束”类型(让我们假设除了*
, * -> *
之外还有一种类型的ConstrainedType
* -> *
和Constraint
)。
:t show
show :: Show a => a -> String
-- Taking extreme liberties with syntax
-- :k (=>)
-- (=>) :: [Constraint] -> * -> ConstrainedType
-- A section?
-- :k (Show a =>)
-- (Show a =>) :: * -> ConstrainedType
-- :k (Showa => * -> String)
-- Show a => a -> String :: ConstrainedType
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.