[英]Haskell types and value constructor
通读一本书,我遇到了 Haskell Bool Type 这是
data Bool = True | False
据我了解,在这种情况下 True 和 False 是值,以下类型的表达式是有效的
c = True
后来,当我想创建一个新类型时,我忘记命名 Value 构造函数并创建了以下类型。
data Cartesian2D = Double Double
在这种情况下,Haskell (GHCI) 没有抱怨。
但是当我试图构建一个像
x = 1.0 2.0
和
x = Double Double
在这两种情况下,Haskell 都返回了错误。
在这种情况下,
Cartesian2D 类型是否有效?
如果类型无效,为什么在构造类型时 Haskell 没有抱怨? 但只在构造类型的值时通知我。
像True
这样的数据构造函数和像Bool
这样的类型构造函数存在于不同的命名空间中。 True
是一个空构造函数的示例,不采用 arguments。 因此,定义
data Cartesian2D = Double Double
定义了一个名为Cartesian2D
的类型构造函数和一个名为Double
的一元数据构造函数。 非空数据构造函数的行为很像函数,使用 arguments 返回其关联类型的值。 在这里, Double
的行为类似于Double -> Cartesian2D
类型的 function(再次注意,类型构造函数Double
和类型构造函数Double
是不同的)。
x = Double 1.0
y = Double 2.0
要创建存储两个双精度的“真实”笛卡尔点类型,请尝试类似
data Cartesian2D = Point Double Double
它定义了一个数据构造函数Point
,它接受两个Double
类型的值来创建一个Cartesian2D
类型的值。
如果您对 null 数据构造函数在某种程度上“特殊”而不像函数的行为这一事实感到困扰(即,您不必调用True
,它只是一个值),您可以将 null 构造函数视为采用()
类型的虚拟参数的一元构造函数的简写:
True :: Bool
简称
True () :: () -> Bool
否则,它总是必须用作True ()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.