我正在经历Hudak"对Haskell"的温和介绍。正如我之前的问题所述,我对C和C ++有一点经验。所以,当我遇到术语" Constructors"在类型构造函数和数据构造函数的介绍中,我可以帮助但是想知道C ++构造函数是否存在任何相似之处,或者它与后者完全类似。
因此,Hudak提供的第一个例子如下:
data Point a = Pt a a
所以从第一个例子开始我就知道RHS是数据构造函数。但是,在这里我并不清楚类型构造函数。
在下一个例子中:
Point
已经明确指出Pt
是数据构造函数,{{1}}是类型构造函数。那么构造函数到底是做什么的呢?它是一个函数调用,就像C ++一样吗?
point和pt的工作究竟有何区别?什么是" pt"在做什么?
答案 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 ++中没有什么类似的东西,因为它没有模式匹配。