Implicit params [was Re: Record of STRefs better than STRef to a Record?]

Iavor S. Diatchki diatchki@cse.ogi.edu
Thu, 14 Nov 2002 10:47:47 -0800


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.

bye
iavor

--
==================================================
| Iavor S. Diatchki, Ph.D. student               |
| Department of Computer Science and Engineering |
| School of OGI at OHSU                          |
| http://www.cse.ogi.edu/~diatchki               |
==================================================