根据我对类型关键字的理解,type
关键字会创建同义词。
type String = [Char]
但我怎么能解释这样的事情:
type Newtype = Bool
Int
String
答案 0 :(得分:6)
正如人们可以阅读the documentation:
2类型和新类型
可以向Haskell程序引入类型的另外两种方法是via
type
和newtype
语句。type
引入了同义词 对于类型并使用相同的数据构造函数。 (..)使用类型时 声明,类型同义词及其基本类型是可互换的 几乎无处不在(处理时有一些限制 实例声明)。
所以type <name> = <type-expression>
只是重命名一个(通常更复杂的)类型表达式。因此,第二个代码片段无效。
然而,<type-expression>
中可能存在更高阶的类型:
type Alias = Either Int String
这是因为Either
类型是更高阶的类型:它具有&#34;元类型&#34; * -> * -> *
。因此,你在这里&#34;申请&#34; Int
和String
至Either
。
请注意,别名没有任何特殊语义:对于Haskell Alias
与Either Int String
相同,反之亦然:Alias
上定义的每个方法都与{{1}一起使用同样。
如果你写Either 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’
是不接受任何(两个)类型参数的类型。因此它无法构建这样的类型。