Am Samstag, 25. Juni 2005 21:22 schrieb Josh Hoyt: > Hello, > > I'm a new Haskeller, and I'm running into a problem attempting to > declare certain types as instances. I was attempting something that's > > effectively equivalent to: > > class Foo a > > > > instance Foo (Either b b) > > but GHC complains: > > Illegal instance declaration for `Foo (Either b b)' > > (The instance type must be of form (T a b c) > > where T is not a synonym, and a,b,c are distinct type variables) > > In the instance declaration for `Foo (Either b b)' > > and so I looked in the report > > (http://www.haskell.org/onlinereport/decls.html#sect4.3.2) and found: > > The general form of the corresponding instance declaration is: > > > > instance cx' => C (T u1 ... uk) where { d } > > > > where k>=0. The type (T u1 ... uk) must take the form of a type > > constructor T applied to simple type variables u1, ... uk; furthermore, T > > must not be a type synonym, and *the ui must all be distinct*. (emphasis > > mine) > > My question is, why this restriction that the types must be distinct? > > In particular, I'd like to declare a very specific type (Either String > String) as an instance. What techniques can I use to accomplish this? > > Josh Hoyt
I don't know, why the tyvars must be distinct in Haskell 98, but if you use extensions (hugs -98; -fglasgow-exts for ghc(i)), you can declare instance Foo (Either b b) where ... or instance Foo (Either String String) where ... without problems. HTH, Daniel _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
