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

Haskell 类型同义词的自动类型构造函数,haskell,Haskell,我有一个名为Vec2F的类型,我可以像这样使用它Vec2F 0.0 0.0。但我想做我自己的类型 type Direction=Vec2F 但是我不能做方向0.0 0.0,我必须定义一个有点麻烦的新函数 direction::Float->Float->Vec2F 方向=Vec2F 我有什么选择?一个选择是 newtype Direction = Direction Vec2F 然后创建Directions,如Direction(Vec2F 0.0 0.0)。请注意,现在Direction和V

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

type Direction=Vec2F

但是我不能做
方向0.0 0.0
,我必须定义一个有点麻烦的新函数

direction::Float->Float->Vec2F
方向=Vec2F

我有什么选择?

一个选择是

newtype Direction = Direction Vec2F
然后创建
Direction
s,如
Direction(Vec2F 0.0 0.0)
。请注意,现在
Direction
Vec2F
是不同的类型,而如果您使用了
type Direction=Vec2F
,它们将是同义词

我有一个类型叫做
Vec2F
,我可以像这样使用
Vec2F 0.0 0.0

不,你不能

您实际上拥有的是一个数据定义

data Vec2F = Vec2F Double Double
这是可以在表达式中使用的第二个
Vec2f
。这两个出现的
Vec2F
彼此不可见。它们生活在不同的名称空间中。一个是类型构造函数,另一个是数据构造函数

你可以有这样的定义

data Foo = Bar Double
data Bar = Foo Float
语言会吞没它(与人类读者相反)

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


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

真的很麻烦吗?一个选项是
newtype Direction=Direction Vec2F
。然后创建
Direction
s,如
Direction(Vec2F 0.0 0.0)
。请注意,现在
Direction
Vec2F
是不同的类型(与
type Direction=Vec2F
不同,两者是同义的)。