
Further, even if I *do* make ClassB two parameter so there should be no ambiguity, GHC still goes into an infinite loop. This happens even with the very latest CVS. Plus I tried creating a proxy function for func2 with type func2' :: Class A a b => a -> b -> String, which calls the calls func2 and placing this in the dictionary instead, but with the same problem. I don't understand why the resolution here should be any different to when func2 is directly within ClassA. The system does stop going into infinite loops if I create only fully decidable instances of ClassA, i.e. where the first parameter is quantified as well. But I need it to be general so I can have different contexts. Is there anyway around this problem without actually putting func2 into ClassA itself? -Si. On Thu, 2005-01-27 at 14:11 +0000, Simon David Foster wrote:
Hi,
(I've attached the full code for this problem)
First I'll explain the problem description, I have two class ClassA and ClassB, the former has two parameters and the latter has one. The second parameter of ClassA is constrained by ClassB.
class ClassB a where class ClassB b => ClassA a b where
Because I wish to effectively pass the context of ClassA around, I need to create a pair of dictionary types (as in Restricted Data Types in Haskell, Hughes 99), one to represent ClassA (DictClassA) and one to represent ClassB (DictClassB). DictClassA also contains a term of type DictClassB since ClassA is a subclass of ClassB. I should then be able to call all the functions of ClassB via the appropriate term of DictClassA, like so (assuming we want to use func2);
*Test> func2D (classBD (dict::DictClassA Int String)) "hello" "bye"
So far so good, but now suppose I want Class A to have the further constraint
class (Data (DictClassA a) b, ClassB b) => ClassA a b where
(so as to make ClassA a subclass of Data)
If we now try and do
*Test> func2D (classBD (dict::DictClassA Int String)) "hello"
We go into an infinite loop. Why? The expression still type-checks ok and I can't see what it is trying to do. All the functions of ClassA can be accessed ok, but not ClassB.
*Test> funcD ((dict::DictClassA Int String)) "hello" 5 "hello"
Is it something to do with ClassB only having one parameter?
I'm running GHC 20041231.
-Si.
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users -- Simon David Foster