Haskell 类型构造函数和类型常量(以及类型变量):什么';有什么区别?
我对类型构造函数、类型常量和类型变量之间的区别感到困惑。 表示有4种类型的类型表达式:Haskell 类型构造函数和类型常量(以及类型变量):什么';有什么区别?,haskell,types,Haskell,Types,我对类型构造函数、类型常量和类型变量之间的区别感到困惑。 表示有4种类型的类型表达式: 类型变量 类型构造函数 类型应用 括号类型 那么什么是类型常量呢?报告说“Char,Int…是类型常量”,但我找不到更详细的例子。更令人困惑的是,IO如何首先被称为“一元类型构造函数”,然后又被称为“一个常量,IO” 我问的原因就是因为这个。书中写道: Haskell类型表达式可以是类型变量或常量(每个类型都有一个关联的种类),也可以是一种类型到另一种类型的应用程序:将种类k1->k2的类型应用到种类k1的类
IO
如何首先被称为“一元类型构造函数”,然后又被称为“一个常量,IO”
我问的原因就是因为这个。书中写道:
Haskell类型表达式可以是类型变量或常量(每个类型都有一个关联的种类),也可以是一种类型到另一种类型的应用程序:将种类k1->k2的类型应用到种类k1的类型会生成种类k2的类型
它说的和报告不一样是第二种类型的类型表达式“构造函数”或“常量”?
该文件还包括显示表示的代码:
data Type = TVar Tyvar | TCon Tycon | TAp Type Type | TGen Int
deriving Eq
data Tyvar = Tyvar Id Kind
deriving Eq
data Tycon = Tycon Id Kind
deriving Eq
显然Tycon
代表“类型构造函数”,但是TCon
代表什么?那么Tyvar
和TVar
呢?为什么需要将T
和Ty
分开?最后一个问题
显然Tycon代表“类型构造函数”,但TCon代表什么呢?泰瓦尔和特瓦尔呢?为什么需要将T和Ty分开
首先
TCon
、TVar
等中的“T”只是一个标记,表明关注的是类型,它们是类型类型的构造函数TCon
获取类型为Tycon
的值,并根据该值等构造类型为type
的值。type
的构造函数没有前缀为Ty
,而只是t
为避免混淆,可以定义类型
data Type = Tyvar Tyvar | Tycon Tycon | ...
因为值构造函数和类型生活在不同的名称空间中,但这将为更多的混乱开辟道路
1类型变量
是可以用其他类型表达式替换的类型表达式,其标识符以小写字母开头(也可以是不以“:”开头的符号)
2类构造函数
例如,类型表达式是否使用零个或多个类型表达式参数来构造类型*
- Int
- 煤焦
- 双重的
是空类型构造函数,它们采用零类型表达式参数来构造类型*
,它们也是类型常量
- 也许吧
- 木卫一
- []
是一元类型构造函数,它们采用一种类型表达式(在这些示例中为*
类型,但一元类型构造函数也可以采用其他类型的参数)
- 或者
- (,)
是二进制类型构造函数
- 斯塔特
是一个三元类型构造函数,包含两个*
类型的参数和一个*->*
类型的参数(因此StateT
的类型是StateT::*->(*->*)->*->*->*
)
3类应用
是形式为t1 t2
的类型表达式。只有当t2
具有种类k2
且t1
具有种类k2->k3
(类似于函数应用程序)时,才是格式良好的。例如,StateT s
是一个类型应用程序,类型表达式StateT
应用于类型变量s
4括号类型
是括号中的类型表达式,它可能是优先级解析或解析所必需的,否则它与未解析的类型表达式相同,例如
instance Monad (Either e) where ...
带括号的类型表达式(或e)
与或e
相同,但有必要使用括号将其与两个类型表达式或e
和的双参数类实例区分开来。在类型中
StateT s ((->) a) b
(>)a
周围的括号用于前置。(注意,类型构造函数(>)
是一种特殊情况,不在类型构造函数以大写字母开头的一般规则中,如[]
,(,)
,(,)
等。)
现在,输入常量。这些只是不包含类型变量的类型表达式,但我认为它在任何地方都没有正式定义。因此,任何只有大写标识符(包括以“:”开头的符号)和特殊情况([]
,(>)
,(,)
,…)的类型表达式都是一个类型常量
- 以大写字母(“:”表示符号)开头的单标记类型表达式或特殊情况都是类型常量
- 完全由类型常量组成的类型表达式是类型常量
在类型理论中,“类型构造函数”通常指更高类型的类型表达式。通过扩展,普通类型通常作为退化情况包括在内
在编程语言中,“类型构造函数”通常具有更具体的含义,指由上下文定义的命名类型构造函数。同样,这可以包括普通类型,如参数为零的退化情况
“类型常数”一词稍不标准。在Haskell定义中,它似乎被非正式地使用,并且可能意味着表示由语言预定义的命名类型构造函数的子集(与用户定义的类型构造函数相反,用户定义的类型构造函数是根据代数类型和预定义的类型构造函数定义的)。因此,每个常量也是一个类型构造函数
至于“T”和“Ty”,这似乎是您正在查看的代码中的命名约定,旨在区分不同语言级别
data Maybe a = Just a | Nothing