|
|
|
|
|
by loup-vaillant
4403 days ago
|
|
I believe phantom type should help with your example. At it's most naive, you need a type for the points in window space, and a second type for the points in drawing space. If you give the sprite a window_point, it will complain about only accepting drawing_points. Now such errors are confined to a conversion function. With phantom types, a the Point "type" would be a function of types to types. It helps when some operation work on all kinds of points: they can be polymorphic with respect to the additional type. data Point a = Point Int Int
draw_sprite :: Point Drawing -> sprite -> Io ()
draw_button :: Point Window -> sprite -> Io ()
translate_point :: Point a -> Point b -> Point a
translate_point (Point x y) (Point xt yt) =
Point (x + xt) (y + yt)
|
|