Haskell 类型构造函数和类型常量(以及类型变量):什么';有什么区别?

Haskell 类型构造函数和类型常量(以及类型变量):什么';有什么区别?,haskell,types,Haskell,Types,我对类型构造函数、类型常量和类型变量之间的区别感到困惑。 表示有4种类型的类型表达式: 类型变量 类型构造函数 类型应用 括号类型 那么什么是类型常量呢?报告说“Char,Int…是类型常量”,但我找不到更详细的例子。更令人困惑的是,IO如何首先被称为“一元类型构造函数”,然后又被称为“一个常量,IO” 我问的原因就是因为这个。书中写道: Haskell类型表达式可以是类型变量或常量(每个类型都有一个关联的种类),也可以是一种类型到另一种类型的应用程序:将种类k1->k2的类型应用到种类k1的类

我对类型构造函数、类型常量和类型变量之间的区别感到困惑。

表示有4种类型的类型表达式:

  • 类型变量
  • 类型构造函数
  • 类型应用
  • 括号类型
  • 那么什么是类型常量呢?报告说“Char,Int…是类型常量”,但我找不到更详细的例子。更令人困惑的是,
    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