2016-10-10 82 views
0

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

'type IsVector v a =(HasPosX v a,HasPosY v a)' – user2407038

+0

那,使用'ConstraintKinds'扩展? – fho

+1

@ user2407038你可以把它变成一个答案。 – chi

回答

0

坐标:

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

然后用位置字段替换成对的坐标字段。然后IsVectorHasPosition并且镜片看起来像position . x而不是positionX

+0

对不起...不是我在找什么。但我可以看到,我提出了一个相当一般的问题。 – fho