
On Thursday 14 November 2002 18:47, Iavor S. Diatchki wrote:
hello,
Well, actually you must be right since the pure field defines a pure (projection) function... Hmmm, ok, can someone explain this to me,
data E s = E{ refi :: STRef s Int, refc :: STRef s Char, m :: Int }
-- this is fine, obviously... pure :: E s -> Int pure e = m e
-- but this is not... pure2 :: (?e :: E s) => Int pure2 = m (?e)
Why exactly isn't this allowed? What is the workaround? Error msg: ------------------------------------------------------------------------ Ambiguous constraint `?e :: E s' At least one of the forall'd type variables mentioned by the constraint must be reachable from the type after the '=>' In the type: forall s. (?e :: E s) => Int While checking the type signature for `pure2' Failed, modules loaded: none. ------------------------------------------------------------------------- -
this seems like a bug in GHC. Hugs is happy with it. The "s" in the pure2 signature is not ambiguous because it is determined when you give the value of the implicit parameter. in fact the way i think about implicit parameters is simply as a nice notation for computations in the environment monad, so in my mind the above two definitions are pretty much the same.
Thanks Iavor! GHC people, can you confirm this, Is it a bug? I'm using Ghc 5.0.4 SuSE rpms. Is there a workaround? Thanks, J.A.