[Haskell] Ambiguity problem
Mads Lindstrøm
mads_lindstroem at yahoo.dk
Fri Jul 22 09:56:40 EDT 2005
Hi Wolfgang
Thank you very much for the reply. I added an extra parameter to the
function, so the code now looks like:
foo :: (Data a) => a -> Constr -> Int
foo idType = (numChildren idType) . fromConstr
numChildren :: (Data a) => a -> a -> Int
numChildren _ x = sum $ gmapQ (\_ -> 1) x
and it works. However, it does seem ugly to have an extra argument, just
to please the type checker.
This extra argument can fortunately be limited to a few functions, in
the program I am working on.
/Mads Lindstrøm
Wolfgang Jeltsch:
> Am Freitag, 22. Juli 2005 14:58 schrieb Mads Lindstrøm:
> > Hi
> >
> > I am struggling with an ambiguity problem. I have the following code:
> > > foo :: Constr -> Int
> > > foo = numChildren . fromConstr
> > >
> > > numChildren :: (Data a) => a -> Int
> > > numChildren x = sum $ gmapQ (\_ -> 1) x
> >
> > which I thought would work, but the GHC-6.4 says:
> > > Ambiguous type variable `a' in the constraint:
> > > `Data a' arising from use of `numChildren' at AutoForm.hs:87:6-16
> > > Probable fix: add a type signature that fixes these type variable(s)
> >
> > I cannot see why I need to add (Data a),
>
> (Data a) is a context, not a type signature.
>
> I think, the problem is that fromConstr converts to a value of an unknown type
> which is converted by numChildren afterwards. The compiler cannot know which
> type it has to use for the intermediate value, i.e., which concrete
> implementation of numChildren and fromConstr it has to use.
>
> > [...]
>
> Best wishes,
> Wolfgang
> _______________________________________________
> Haskell mailing list
> Haskell at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell
>
More information about the Haskell
mailing list