Hi Alistair!

Just a "quick" reply (I didn't had time to look at Ralf's technique).
Looking at your code, it seems to me that you are missing the notion of a 
supertype (perhaps, that's the intended thing with BaseClass?). 

I would use an existencial type to "capture" this notion:

===========
data Base = forall c . Method c => Base c

instance BaseClass Base

instance Method Base where
  method1 (Base x) i = Base (method1 x i)
  method2 (Base x) = method2 x

the modifications on the code would be:

class BaseClass c => Method c where
  -- method1 returns a supertype Base
  method1 :: c -> Int -> Base
  method2 :: c -> Int

instance Method c => Method (SubBase2 c) where
 -- method1 does not fail any more
  method1 x i = Base (SubBase2 (SubBase1 5))
  method2 x = 2

makeSubType s =
  if s == "SubBase1"
  then Base (SubBase1 3)
  else Base (SubBase2 (SubBase1 4))
============

Perhaps a better name for Base would be SuperMethod 
(since it is really trying to capture the fact that is the super 
type for Method).

Hope it helps

Cheers,

Bruno


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to