
Ryan,
That did it! Thanks a lot for your help.
Tad
On Sun, Apr 3, 2011 at 1:14 PM, Ryan Ingram
On Sun, Apr 3, 2011 at 1:00 PM, Tad Doxsee
wrote: "Equality constraints ... enable a simple translation of programs using functional dependencies into programs using family synonyms instead.
So I tried:
class (T s ~ a) => ShapeC a s where type T s :: * draw :: s -> String copyTo :: s -> T s -> T s -> s
but got a compile error:
Alas, GHC 7.0 still cannot handle equality superclasses: T s ~ a
So my question is, how does one convert the above code to use type families instead of functional dependencies? Is one technique preferable over another?
Sadly the documentation assumes the feature that you show is missing. That said, you don't need that feature for the simple FD you have.
Just do
class ShapeC s where type T s :: * draw :: s -> String copyTo :: s -> T s -> T s -> s
This code should work:
data ShapeD a = forall s. (ShapeC s, a ~ T s) => MkShapeD s
instance ShapeC (ShapeD a) where type T (ShapeD a) = a draw (MkShapeD s) = draw s copyTo (MkShapeD s) x y = MkShapeD (copyTo s x y)