了解haskell中的Type关键字

dan*_*dhi 0 haskell

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

type String = [Char] 
Run Code Online (Sandbox Code Playgroud)

但我怎么能解释这样的事情:

type Newtype = Bool
      Int
      String
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

正如人们可以阅读文档:

2键入和新类型

可以通过typenewtype语句向Haskell程序引入类型的另外两种方式.type引入了 类型的同义词并使用相同的数据构造函数.(..)当使用类型声明时,类型同义词及其基类型几乎可以在任何地方互换(在处理实例声明时有一些限制).

因此,type <name> = <type-expression>只需重命名一个(通常更复杂的)类型表达式.结果,第二个代码片段无效.

但是,可能存在<type-expression>类似的更高阶类型:

type Alias = Either Int String
Run Code Online (Sandbox Code Playgroud)

这是因为Either类型是更高阶的类型:它具有"元类型" * -> * -> *.所以在这里,你这样"应用" Int,并StringEither.

请注意,别名没有任何特殊语义:对于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是一种接受任何(两个)类型参数的类型.因此它不能构造这样的类型.