2017-07-07 97 views
0

从我对类型关键字的理解中,type关键字创建同义词。了解haskell中的类型关键字

type String = [Char] 

但我怎么能解释是这样的:

type Newtype = Bool 
     Int 
     String 
+8

你从哪里找到第二个代码片段。这不是有效的Haskell代码。 –

+2

@WillemVanOnsem从理论上讲,它是有效的Haskell;它所做的是将'Newtype'类型定义为'(Bool Int)String'。这是不好的,因为'Bool'不接受任何类型参数。但是,'输入Newtype = Int String'将是合法的。 - 显然你是对的:这看起来好像有人完全搞砸了'newtype'关键字的例子。 – leftaroundabout

+3

@leftaroundabout:是的,它在语法和语法上是有效的Haskell。但是类型系统会误报'Bool'类型为'*'而不是'* - > * - > *'。 –

回答

6

正如人们可以在the documentation阅读:

2类型和NEWTYPE

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

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

然而,有可能存在于<type-expression>像高阶类型:

type Alias = Either Int String 

这是因为Either类型是高阶型:它有“元类型” * -> * -> *。所以在这里你可以“应用”IntStringEither

注意,别名没有任何特殊的语义: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’ 

所以抱怨Bool是一类不接受任何(二)型参数。因此它不能构造这样的类型。