2016-10-10 91 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