Type of an HsExpr

Sven Urbanski svenurbanski at gmail.com
Mon May 23 16:51:29 CEST 2011


Hello everyone,

On Thu, May 19, 2011 at 09:17, Simon Peyton-Jones <simonpj at microsoft.com> wrote:
> Maybe you want
>
> tcRnExpr :: HscEnv
>         -> InteractiveContext
>         -> LHsExpr RdrName
>         -> IO (Messages, Maybe Type)
>
> from TcRnDriver?


This is pretty close to what I need. Unfortunately, I have
LhsExpr Id
not RdrName.

A little detail: I am traversing the LHsExprs inside a "TypecheckedSource".
Since I mostly only need the HsExprs, I could also use a "ParsedModule".
I have tried switching to ParsedModule. But whenever I use the PostTcType from
a MatchGroup (within a FunBind) I get:
 panic! (the 'impossible' happened)
  (GHC version 6.12.3 for i386-unknown-linux):
        Evaluated the place holder for a PostTcType

So, I guess the PostTcType is just not well defined within a ParsedModule.
Thats why I use TypecheckedSource.




On Thu, May 19, 2011 at 17:06, Ranjit Jhala <jhala at cs.ucsd.edu> wrote:
>  dsExpr :: HsExpr Id -> DsM CoreExpr
>
> which "desugars" the source-level HsExpr into the CoreExpr.

Again, pretty close to what I need. The Monad is a little unexpected.

I wrote a simple function:

hsExpr2TypeDo :: HsExpr Id -> DsM Type
hsExpr2TypeDo hsexpr = do
  let ioCoreE = dsExpr hsexpr
  x <- ioCoreE
  return (exprType x)

(One could write that a little shorter, but that's not the point)

My problem was, that I eventually need the Type from the DsMonad.
Obviously, I cant just get the value out of a monad (that's against
the idea of monads).

So I was looking for a function that transforms: DsM a -> IO a.

I found:
initDs :: HscEnv -> Module -> GlobalRdrEnv -> TypeEnv -> DsM a -> IO
(Messages, Maybe a)

1) For the HscEnv I use the result of getSession
2) Module is the result of ms_mod (getModSummary m))

However for the other parameters, I use empty values:

3) emptyGlobalRdrEnv
4) emptyTypeEnv

This actually works (at least for the simple cases I have tested).
But it seems wrong to me to pass two empty environments.
Can I somehow obtain valid environments?



Another question: Why is dsExpr monadic?
What side effects could there possibly be?


Thanks for all the answers, I'm sorry that I answer so late,
I wanted to try everything out before responding.

Thanks,
Sven



More information about the Glasgow-haskell-users mailing list