Dear Stephan,

Finally!!!! It's alive and working, huhhuu! After 3 long days...

As predictable, it was my fault. There was basically two big mistakes:

-  splitAF::(SubUnit a b, Ord a)=>BoxPair -> ActiveSubUnit a -> StateMBC a ()
instead of "splitAF::(SubUnit a, Ord a)=> BoxPair -> a -> StateMBC a ()"

-  type SetActiveSubUnits a = Set (ActiveSubUnit a)
instead of "type SetActiveSubUnits a = Set a"

After those corrections there was one error remaining:

src/DeUni.hs:264:39:
    Could not deduce (Unit a ~ Unit subUnit0)
    from the context (SubUnit a, Ord a)
      bound by the type signature for
                 mbc :: (SubUnit a, Ord a) =>  [Point] -> SetActiveSubUnits a -> Box -> StateMBC a [Unit a]
      at src/DeUni.hs:(253,1)-(310,53)
    NB: `Unit' is a type function, and may not be injective
    Expected type: [Unit a]
      Actual type: [Unit subUnit0]

Then I decided to go back to Fun Dep instead of GADT due the "injective" complain.

class SubUnit subUnit unit | subUnit -> unit, unit -> subUnit where
    .....

instead of

class SubUnit subUnit where
    type Unit subUnit :: *
    .....

And ... Bingo!

My last question, how can I make it work using GADT?

Thank so much for your kindly assistance.

Edgar



On 26 March 2011 23:13, Stephen Tetley <stephen.tetley@gmail.com> wrote:
Hi Edgar

I think you have some errors of construction rather than just a
problem with the type families / fun deps.

Note, I've knocked off the class constraints on the data declarations
on the copy I'm working with (e.g ActiveSubUnit) , this may or may not
change things.

This change to splitAF will type check, whether or not it does what you want:

> splitAF::(SubUnit a, Ord a)=> BoxPair -> a -> StateMBC a ()
> splitAF pairBox e = case subUnitPos pairBox e of


Your code was:

> splitAF::(SubUnit a)=>BoxPair -> a -> StateMBC a ()
> splitAF pairBox e = case subUnitPos pairBox (activeUnit e) of


getUnitsOnPlane will compile if you comment out the type sig, but GHC
generates this type sig:


getUnitsOnPlane ::
 (Unit su1 ~ Unit su,
  SubUnit (ActiveSubUnit su),
  SubUnit su1,
  SubUnit su,
  Ord su) =>
 [Point]
 -> BoxPair
 -> t
 -> StateT
      (SubUnitsSets (ActiveSubUnit su))
      Data.Functor.Identity.Identity
      [Unit su]
       -- Defined at DeUni.hs:324:1-15

Note the class constraints are introducing a type variable *su1* that
isn't mentioned in the function arguments, this strongly makes me
think the function body isn't doing what it should. Also GHC infers a
type var *t* rather than Plane for the second arg, again this makes me
think the function body is not right.

I'm a bit at a loss with the mbc function, if I comment out the
function type sig and local type sigs GHC generates some errors
mentioning Edge - as Edge is one of the instances of SubUnit, I think
the function body is less polymorphic than you expect.

Best wishes

Stephen

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