通读一本书,我遇到了 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都返回了一个错误。
在这种情况下,
笛卡尔2D类型有效吗?
如果类型无效,为什么Haskell在我构造类型时没有抱怨?但只是在构造类型的值时通知我。
数据构造函数(如True
)和类型构造函数(如Bool
)存在于单独的命名空间中。True
是nullary构造函数的一个示例,不带任何参数。因此,定义
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 ()
。