类型同义词的自动类型构造函数

时间:2013-11-25 18:09:44

标签: haskell

我有一个名为Vec2F的类型,我可以像Vec2F 0.0 0.0一样使用它。但我想制作自己的类型

type Direction = Vec2F

但是我不能做Direction 0.0 0.0而我必须定义一个有点麻烦的新函数。

direction :: Float -> Float -> Vec2F
direction = Vec2F

我有哪些替代方案?

2 个答案:

答案 0 :(得分:9)

  

我有一个名为Vec2F的类型,我可以像Vec2F 0.0 0.0

一样使用它

不,你不能。

您实际拥有的是数据定义

data Vec2F = Vec2F Double Double

这是你可以在表达式中使用的第二个Vec2f。这两次Vec2F出现是彼此不可见的。它们位于不同的命名空间中。一个是类型构造函数,另一个是数据构造函数

您可以使用

等定义
data Foo = Bar Double
data Bar = Foo Float

语言将吞下它(与人类读者相反)。

定义类型同义词时,它只会成为类型(构造函数)的同义词。它对数据构造函数一无所知。

无法在标准Haskell中定义数据构造函数同义词。您可以使用view patterns [-XViewPatterns]来达到类似的效果。我没试过。

答案 1 :(得分:2)

一个选项是

newtype Direction = Direction Vec2F

然后,您可以像Direction一样创建Direction (Vec2F 0.0 0.0)。请注意,现在DirectionVec2F是不同的类型,如果您使用type Direction = Vec2F,它们将是同义词。