我有一个表示方向的类型,它有一个轴和一个方向:
data Dir = DirX | DirY | DirZ | DirW deriving (Show, Eq)
data Sign = Pos | Neg deriving (Show, Eq)
newtype Direction = Direction (Dir, Sign) deriving (Show, Eq)
看起来有点复杂。我不需要Sign
,Dir
也可以是不同的类型,我只想对它们的构造函数进行模式匹配。那么,有没有更好的方法来定义这种类型呢?
所以我想做的是
data Direction = Direction (DirX | DirY | DirZ | DirW) (Pos | Neg) deriving (Show, Eq)
因为我做类似的事情\(Direction _ s) -> if s == Pos then ... else ...
,但我从不使用Dir
或Sign
在Direction
我想我不是第一个提出这个问题的人,但是我真的不知道如何用Google搜索这个问题。
不,没有更好的方法。
...然后,就个人而言,我发现这种方式已经非常完美了。因此,也许这不是一个可怕的负担。
当然,有一些方法可以定义您可能仍然感兴趣的完全不同的类型。例如,我过去沿这些线使用了方向类型,效果很好:
data Direction = Direction { x, y, z, w :: Int }
aboutFace (Direction x y z w) = Direction (-x) (-y) (-z) (-w)
-- e is a traditional name from linear algebra for an axis-aligned unit vector
ex = Direction 1 0 0 0
ey = Direction 0 1 0 0
ez = Direction 0 0 1 0
ew = Direction 0 0 0 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句