数据构造函数中构造函数的含义和Haskell中的Type构造函数

时间:2017-09-09 17:40:56

标签: haskell constructor

我正在经历Hudak"对Haskell"的温和介绍。正如我之前的问题所述,我对C和C ++有一点经验。所以,当我遇到术语" Constructors"在类型构造函数和数据构造函数的介绍中,我可以帮助但是想知道C ++构造函数是否存在任何相似之处,或者它与后者完全类似。

因此,Hudak提供的第一个例子如下:

data Point a = Pt a a

所以从第一个例子开始我就知道RHS是数据构造函数。但是,在这里我并不清楚类型构造函数。

在下一个例子中:

Point

已经明确指出Pt是数据构造函数,{{1}}是类型构造函数。那么构造函数到底是做什么的呢?它是一个函数调用,就像C ++一样吗?

point和pt的工作究竟有何区别?什么是" pt"在做什么?

2 个答案:

答案 0 :(得分:1)

我认为你的术语有点陷入困境。我可能会说“Point是一种更高级的类型”。这只意味着它形成了另一种类型的新类型。通常我们只是将Pt称为构造函数。 这是一个例子:

data Point a = Pt a a

samplePoint :: Point Int
samplePoint = Pt 1 2

答案 1 :(得分:1)

构造函数确实可以用于,构造一个值(或分别类型),就像C ++类构造函数一样:

Prelude> data Point a = Pt a a
Prelude> :type Pt
Pt :: a -> a -> Point a
Prelude> :kind Point
Point :: * -> *

这大致相当于

template <typename A>
struct Point {
  A x, y;
  Point(A x, A y): x(x), y(y) {}
};

...或者,为了得到相同的名称,

template <typename A>
Point Pt(A x, A y) { return Point(x,y); }

但并非全部,值构造函数也可用于解构值:

centerDist :: Floating a => Point a -> a
centerDist (Pt x y) = sqrt $ x^2 + y^2

在C ++中没有什么类似的东西,因为它没有模式匹配。