理解haskell中的Type关键字

理解haskell中的Type关键字,haskell,Haskell,根据我对type关键字的理解,typekeyword创建同义词 type String = [Char] 但我如何解释这样的事情: type Newtype = Bool Int String 正如人们在书中所读到的: 2型和新型 向Haskell程序引入类型的其他两种方法是 type和newtype语句类型引入同义词 并使用相同的数据构造函数。(..)在使用类型时 声明时,类型同义词及其基类型是可互换的 几乎所有地方(在处理 实例声明) 因此type=只需重命名一

根据我对type关键字的理解,
type
keyword创建同义词

type String = [Char] 
但我如何解释这样的事情:

type Newtype = Bool
      Int
      String
正如人们在书中所读到的:

2型和新型

向Haskell程序引入类型的其他两种方法是
type
newtype
语句
类型
引入同义词
并使用相同的数据构造函数。(..)在使用类型时 声明时,类型同义词及其基类型是可互换的 几乎所有地方(在处理 实例声明)

因此
type=
只需重命名一个(通常更复杂)类型表达式。因此,第二个代码片段无效

但是,
中可能有更高阶的类型,如:

type Alias = Either Int String
这是因为
或者
类型是一个更高阶的类型:它有“元类型”
*->*->*->*
。因此,这里您可以将
Int
String
应用于

请注意,别名没有任何特殊语义:对于Haskell,
alias
任意一个Int-String
相同,反之亦然:在
alias
上定义的每个方法也适用于
任意一个Int-String

但是,如果您写入
type NewType=Bool Int String
,则类型系统将抱怨:

• Expecting two fewer arguments to ‘Bool’
  Expected kind ‘* -> * -> k0’, but ‘Bool’ has kind ‘*’
• In the type ‘Bool Int String’
  In the type declaration for ‘NewType’
因此它抱怨
Bool
是一种不接受任何(两)个类型参数的类型。因此,它不能构造这样一种类型。

,正如人们可以读入的:

2型和新型

向Haskell程序引入类型的其他两种方法是
type
newtype
语句
类型
引入同义词
并使用相同的数据构造函数。(..)在使用类型时 声明时,类型同义词及其基类型是可互换的 几乎所有地方(在处理 实例声明)

因此
type=
只需重命名一个(通常更复杂)类型表达式。因此,第二个代码片段无效

但是,
中可能有更高阶的类型,如:

type Alias = Either Int String
这是因为
或者
类型是一个更高阶的类型:它有“元类型”
*->*->*->*
。因此,这里您可以将
Int
String
应用于

请注意,别名没有任何特殊语义:对于Haskell,
alias
任意一个Int-String
相同,反之亦然:在
alias
上定义的每个方法也适用于
任意一个Int-String

但是,如果您写入
type NewType=Bool Int String
,则类型系统将抱怨:

• Expecting two fewer arguments to ‘Bool’
  Expected kind ‘* -> * -> k0’, but ‘Bool’ has kind ‘*’
• In the type ‘Bool Int String’
  In the type declaration for ‘NewType’

因此它抱怨
Bool
是一种不接受任何(两)个类型参数的类型。因此它无法构造这样的类型。

您在哪里找到第二个代码片段的。这不是有效的Haskell代码。@WillemVanOnsem理论上讲,这是有效的Haskell代码;它所做的是,它将类型
Newtype
定义为
(Bool Int)字符串
。这不是很好,因为
Bool
不接受任何类型参数。但是,
type Newtype=任何一个Int字符串都是合法的。-显然你是对的:这看起来像是有人把
newtype
关键字的示例搞砸了。@leftaroundabout:是的,它在语法和语法上都是有效的Haskell。但是类型系统将出错,因为
Bool
具有类型
*
,而不是
*->*->*->*
。您在哪里找到第二个代码片段的。这不是有效的Haskell代码。@WillemVanOnsem理论上讲,这是有效的Haskell代码;它所做的是,它将类型
Newtype
定义为
(Bool Int)字符串
。这不是很好,因为
Bool
不接受任何类型参数。但是,
type Newtype=任何一个Int字符串都是合法的。-显然你是对的:这看起来像是有人把
newtype
关键字的示例搞砸了。@leftaroundabout:是的,它在语法和语法上都是有效的Haskell。但是类型系统将出错,因为
Bool
具有类型
*
,而不是
*->*->*->*