Lan*_*ard 2 haskell types nomenclature
根据我的理解,Haskell中有4种"类型":
data
=
在data
类型之后是什么; 在技术上不是类型,我不认为)type
class
instance
问题是:
data
类型和class
类型类之间的区别是什么.它们看似相似,但显然它们有一些不同的特征.与(3)相同.data
类型和instance
类型类实例之间的区别是什么.我是Haskell的新手.
data
并newtype
引入新类型(或实际类型构造函数 - Maybe
不是类型,但是Maybe a
任何a
类型的类型).
一个data
声明引入了两个新的类型(还剩下些什么的=
)和一个方式来表示这种类型的数据(这是什么的权利=
).
例如,如果您有这样的数据声明:
data SomeType = SomeConstructor
Run Code Online (Sandbox Code Playgroud)
然后你引入了一个名为的新类型SomeType
,以及构造值的方法SomeType
,即构造函数SomeConstructor
(顺便提一下,它没有任何参数,因此是唯一存在于此类型中的值).
一个类型类没有做任何的这些事情(而且也没有一个instance
).类型类引入了一个约束和一堆多态函数,如果满足该约束,它们应该是可用的.An instance
基本上是通过为这些函数提供实现来说"这种类型满足此约束".因此,a 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
Run Code Online (Sandbox Code Playgroud)
(请注意,实际Show
在课堂上Prelude
不十分像这样)
show
现在有了类型Show a => a -> String
,你可以读作
对于所有a,如果他们满足约束
Show
(或者,如果他们是一个实例Show
),这是一个函数,它接受a
一个字符串并返回一个字符串
这样的实例看起来像这样
instance Show SomeType where
show SomeConstructor = "SomeConstructor"
Run Code Online (Sandbox Code Playgroud)
意思是
SomeType
满足约束Show
,我将通过提供实现来告诉你如何show
这大致是它的要点.有一些语言扩展允许类型类和实例发生更多相关事情,但您现在不需要担心.