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