我有一个名为Vec2F
的类型,我可以像Vec2F 0.0 0.0
一样使用它。但我想制作自己的类型
type Direction = Vec2F
但是我不能做Direction 0.0 0.0
而我必须定义一个有点麻烦的新函数。
direction :: Float -> Float -> Vec2F
direction = Vec2F
我有哪些替代方案?
答案 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)
。请注意,现在Direction
和Vec2F
是不同的类型,如果您使用type Direction = Vec2F
,它们将是同义词。