从我对类型关键字的理解中,type
关键字创建同义词。了解haskell中的类型关键字
type String = [Char]
但我怎么能解释是这样的:
type Newtype = Bool
Int
String
从我对类型关键字的理解中,type
关键字创建同义词。了解haskell中的类型关键字
type String = [Char]
但我怎么能解释是这样的:
type Newtype = Bool
Int
String
正如人们可以在the documentation阅读:
2类型和NEWTYPE
的另外两种方式可以通过向Haskell程序引入类型
type
和newtype
声明。type
为类型引入同义词 ,并使用相同的数据构造函数。 (..)使用类型 声明时,类型同义词及其基本类型几乎在任何地方都是可互换的 (在处理 实例声明时有一些限制)。
所以type <name> = <type-expression>
只是重新命名一个(通常是更复杂的)类型的表达式。结果第二个代码片段是无效。
然而,有可能存在于<type-expression>
像高阶类型:
type Alias = Either Int String
这是因为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’
所以抱怨Bool
是一类不不接受任何(二)型参数。因此它不能构造这样的类型。
你从哪里找到第二个代码片段。这不是有效的Haskell代码。 –
@WillemVanOnsem从理论上讲,它是有效的Haskell;它所做的是将'Newtype'类型定义为'(Bool Int)String'。这是不好的,因为'Bool'不接受任何类型参数。但是,'输入Newtype = Int String'将是合法的。 - 显然你是对的:这看起来好像有人完全搞砸了'newtype'关键字的例子。 – leftaroundabout
@leftaroundabout:是的,它在语法和语法上是有效的Haskell。但是类型系统会误报'Bool'类型为'*'而不是'* - > * - > *'。 –