我有一个叫做的类型Vec2F,我可以像这样使用它Vec2F 0.0 0.0.但我想制作自己的类型
type Direction = Vec2F
但后来我做不到Direction 0.0 0.0,我必须定义一个有点麻烦的新功能.
direction :: Float -> Float -> Vec2F
direction = Vec2F
我有什么替代品?
我有一个叫做的类型
Vec2F,我可以像这样使用它Vec2F 0.0 0.0
你不能.
你实际拥有的是数据定义
data Vec2F = Vec2F Double Double
Run Code Online (Sandbox Code Playgroud)
这是Vec2f你可以在表达式中使用的第二个.这两次出现是Vec2F彼此不可见的.它们位于不同的命名空间中.一个是类型构造函数,另一个是数据构造函数.
你可以有像这样的定义
data Foo = Bar Double
data Bar = Foo Float
Run Code Online (Sandbox Code Playgroud)
语言将吞下它(与人类读者相反).
定义类型同义词时,它只会成为类型(构造函数)的同义词.它对数据构造函数一无所知.
没有办法在标准Haskell中定义数据构造函数同义词.您可能可以使用视图模式 [-XViewPatterns]来达到类似的效果.我没试过.