使用lenses
自动镜头生成方法我最终得到了HasX
类型的几种类型:
class HasPositionX s a | s -> a where
positionX :: Lens' s a
class HasPositionY s a | s -> a where
positionY :: Lens' s a
当然,这是2d矢量类型的一部分。现在我正在寻找一种方法将这些约束组合成一个基本上说IsVector s a
可用的约束:
showVec :: (Num a, IsVector v a) => v -> String
showVec a = show (view positionX a) ++ "," ++ show (view positionY a)
答案 0 :(得分:0)
您可以通过定义仅包含坐标的新记录来执行此操作:
data Position = Position {
_positionX :: Int
_positionY :: Int
}
然后用位置字段替换每对坐标字段。然后IsVector
为HasPosition
,镜头看起来像position . x
而不是positionX
。