Haskell类型和值构造函数



通读一本书,我遇到了 Haskell Bool 类型,它是

data Bool = True | False

据我了解,在这种情况下,True 和 False 是值,以下类型的表达式是有效的

c = True

后来,当我想创建一个新类型时,我忘记命名 Value 构造函数并创建了以下类型。

data Cartesian2D = Double Double

在这种情况下,Haskell(GHCI)没有抱怨。

但是当我试图构建一个值时,例如

x = 1.0 2.0 

x = Double Double

在这两种情况下,Haskell都返回了一个错误。

在这种情况下,

  1. 笛卡尔2D类型有效吗?

  2. 如果类型无效,为什么Haskell在我构造类型时没有抱怨?但只是在构造类型的值时通知我。

数据构造函数(如True)和类型构造函数(如Bool)存在于单独的命名空间中。Truenullary构造函数的一个示例,不带任何参数。因此,定义

data Cartesian2D = Double Double

定义一个名为Cartesian2D的类型构造函数和一个名为Double的一数据构造函数。非空数据构造函数的行为与函数非常相似,它们采用参数来返回其关联类型的值。在这里,Double的行为类似于类型Double -> Cartesian2D的函数(再次注意,类型构造函数Double和类型构造函数Double是不同的)。

x = Double 1.0
y = Double 2.0

要创建一个存储两个双精度的"真实"笛卡尔点类型,请尝试类似

data Cartesian2D = Point Double Double

它定义了一个数据构造函数Point,该构造函数采用两个类型Double的值来创建类型Cartesian2D的值。


如果您对空数据构造函数在行为不像函数方面在某种程度上"特殊"这一事实感到困扰(即,您不必调用True,它只是一个值),您可以将空构造函数视为一元构造函数的简写,这些构造函数采用()类型的虚拟参数:

True :: Bool

是 的缩写

True () :: () -> Bool

否则,必须始终用作True ()

最新更新