了解haskell中的Type关键字

时间:2017-07-07 09:51:16

标签: haskell

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

type String = [Char] 

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

type Newtype = Bool
      Int
      String

1 个答案:

答案 0 :(得分:6)

正如人们可以阅读the documentation

  

2类型和新类型

     

可以向Haskell程序引入类型的另外两种方法是via   typenewtype语句。 type引入了同义词   对于类型并使用相同的数据构造函数。 (..)使用类型时   声明,类型同义词及其基本类型是可互换的   几乎无处不在(处理时有一些限制   实例声明)。

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

然而,<type-expression>中可能存在更高阶的类型:

type Alias = Either Int String

这是因为Either类型是更高阶的类型:它具有&#34;元类型&#34; * -> * -> *。因此,你在这里&#34;申请&#34; IntStringEither

请注意,别名没有任何特殊语义:对于Haskell AliasEither 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’ 接受任何(两个)类型参数的类型。因此它无法构建这样的类型。