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