我是haskell的初学者,我想知道定义新类型的正确方法。假设我想定义一个Point类型。在命令式语言中,它通常相当于:
data Point = Int Int
然而在haskell中,我通常会看到如下定义:
data Point = Point Int Int
有什么区别以及何时应该使用每种方法?
答案 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
,你可以说“这个东西是int
或float
”但是你无法知道它实际上是哪一个(除非通过手动跟踪状态)。
使用C联合编写上面的代码,根据所使用的构造函数,您无法使用case
执行不同的操作,并且必须明确跟踪{{1}中包含的类型并使用x
。