如何结合几种类型约束?

时间:2016-10-10 14:57:11

标签: haskell

使用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)

1 个答案:

答案 0 :(得分:0)

您可以通过定义仅包含坐标的新记录来执行此操作:

data Position = Position {
  _positionX :: Int
  _positionY :: Int
}

然后用位置字段替换每对坐标字段。然后IsVectorHasPosition,镜头看起来像position . x而不是positionX