根据我对type关键字的理解,type关键字会创建同义词.
type String = [Char]
Run Code Online (Sandbox Code Playgroud)
但我怎么能解释这样的事情:
type Newtype = Bool
Int
String
Run Code Online (Sandbox Code Playgroud)
正如人们可以阅读文档:
2键入和新类型
可以通过
type和newtype语句向Haskell程序引入类型的另外两种方式.type引入了 类型的同义词并使用相同的数据构造函数.(..)当使用类型声明时,类型同义词及其基类型几乎可以在任何地方互换(在处理实例声明时有一些限制).
因此,type <name> = <type-expression>只需重命名一个(通常更复杂的)类型表达式.结果,第二个代码片段无效.
但是,可能存在<type-expression>类似的更高阶类型:
type Alias = Either Int String
Run Code Online (Sandbox Code Playgroud)
这是因为Either类型是更高阶的类型:它具有"元类型" * -> * -> *.所以在这里,你这样"应用" Int,并String于Either.
请注意,别名没有任何特殊语义:对于Haskell Alias是相同的,Either Int String反之亦然:每个定义的方法也Alias适用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’
Run Code Online (Sandbox Code Playgroud)
所以它抱怨这Bool是一种不接受任何(两个)类型参数的类型.因此它不能构造这样的类型.