【发布时间】:2017-07-29 05:25:15
【问题描述】:
阅读我的一本 Haskell 书籍,我遇到了这样一句话:
数据声明总是创建一个新的类型构造函数,但可能或可能不创建新的数据构造函数。
一个人应该能够在没有数据构造函数的情况下声明一种数据类型,这听起来很奇怪,因为似乎永远无法实例化该类型。所以我试了一下。以下数据声明编译没有错误。
data B = String
如何创建这种类型的实例?有可能吗?我似乎找不到方法。
我认为可能会自动创建名称与类型构造函数匹配的数据构造函数,但似乎并非如此,如尝试使用 B 作为带有声明的数据构造函数所导致的错误所示范围内。
Prelude> data B = String deriving Show
Prelude> B
<interactive>:129:1: error: Data constructor not in scope: B
如果该类型永远无法实例化,为什么允许编译此数据声明? 尽管没有已知的实际应用,但是否仅出于某种形式的原因才允许?
我还想知道我的书中关于没有构造函数的数据类型的陈述是否指的是通过type 或newtype 关键字声明的类型,而不是data。
-
在
type的情况下,类型同义词显然不使用数据 构造函数,如下所示。Prelude> type B = String Prelude>诸如此类的类型同义词可以由 他们设置的类型。但我不相信这是我的 本书所指的类型同义词似乎并没有像声明新数据类型那样多 只需为现有类型定义一个新别名。
-
在
newtype的情况下,似乎没有数据的类型 无法创建构造函数,如下错误所示。Prelude> newtype B = String <interactive>:132:13: error: • The constructor of a newtype must have exactly one field but ‘String’ has none • In the definition of data constructor ‘String’ In the newtype declaration for ‘B’
type 和 newtype 似乎不是本书所指的内容,这让我回到了我最初的问题:为什么可以在没有数据构造函数的情况下使用 data 声明一个类型?
【问题讨论】: