
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