繁体   English   中英

Haskell 类型和值构造函数

[英]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 都返回了错误。

在这种情况下,

  1. Cartesian2D 类型是否有效?

  2. 如果类型无效,为什么在构造类型时 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM