在haskell中将类型包含在其定义中的目的是什么?

时间:2016-03-14 15:58:29

标签: haskell

我是haskell的初学者,我想知道定义新类型的正确方法。假设我想定义一个Point类型。在命令式语言中,它通常相当于:

data Point = Int Int

然而在haskell中,我通常会看到如下定义:

data Point = Point Int Int

有什么区别以及何时应该使用每种方法?

2 个答案:

答案 0 :(得分:9)

在OO语言中,您可以使用类似

的类来定义类
class Point {
   int x,y;
   Point(int x, int y) {...
}

它类似

data Point = ...

是类型定义(类似于上面的class Point

     ...  = Point Int Int

是构造函数,您也可以使用不同的名称定义构造函数,但无论如何都需要名称。

data Point = P Int Int

答案 1 :(得分:3)

data定义最终是标记的联盟。例如:

data Maybe a = Nothing | Just a

现在您将如何使用语法编写此类型?

此外,在Haskell中你可以模式匹配这个值,并查看用于构建值的构造函数。模式匹配需要构造函数的名称,如果类型只有一个构造函数,它通常会重用与该类型相同的名称。

例如:

let x = someOperationReturningMaybe
in case x of
        Nothing -> 0
        Just y -> y+5

这与普通联合类型不同,例如C union,你可以说“这个东西是intfloat”但是你无法知道它实际上是哪一个(除非通过手动跟踪状态)。

使用C联合编写上面的代码,根据所使用的构造函数,您无法使用case执行不同的操作,并且必须明确跟踪{{1}中包含的类型并使用x