Holes in GHC

Simon Peyton-Jones simonpj at microsoft.com
Thu Jan 26 17:10:29 CET 2012


A thought.  Based on my limited understanding of your goals, suppose instead of (say)

	f (__, True) __

you transformed to

	\xy -> f (x,True) y

That is, replace each hole with a variable.  Now do type inference.  You'll get a type like

	Int -> Bool -> ...

and that tells you the type of the two holes.  Or you might get a type like

	forall a.  a -> [a] -> ....

and that too tells you a lot about the types of the holes.  Or you might get a type like

	forall a. Ord a => a -> [a] -> ...

To me it looks like you get exactly the info that (I think) you want, and moreover you can do that without changing the type inference engine at all.

Simon
	

|  -----Original Message-----
|  From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-
|  bounces at haskell.org] On Behalf Of Simon Peyton-Jones
|  Sent: 26 January 2012 14:25
|  To: Thijs Alkemade; glasgow-haskell-users at haskell.org
|  Subject: RE: Holes in GHC
|  
|  Thijs
|  
|  You are describing the implementation of something, but you do not give a
|  specification.  It's hard for me to help you with the design of something when I
|  don't know what the goal is.
|  
|  Can you give a series of concrete examples of what you want to happen?  Is this
|  just in GHCi?  Or do you expect the batch compiler to behave specially?
|  
|  Don't worry about the implementation: just say what you would LIKE to achieve.
|  
|  Simon
|  
|  |  -----Original Message-----
|  |  From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-
|  users-
|  |  bounces at haskell.org] On Behalf Of Thijs Alkemade
|  |  Sent: 25 January 2012 15:21
|  |  To: glasgow-haskell-users at haskell.org
|  |  Subject: Holes in GHC
|  |
|  |  Hello!
|  |
|  |  As mentioned in our previous mail [1], we've been working on
|  |  introducing Agda's holes into GHC [2]. Our general approach is as
|  |  follows: we've added a hole to the syntax, denoted here by two
|  |  underscores: "__". We've introduced a new HsExpr for this, which
|  |  stores the hole's source span (as this is the only thing that a user
|  |  needs to identify the hole).
|  |
|  |  Then, we extended the local environment of the typechecker to include
|  |  a mutable Map, mapping a SrcSpan to a Type and a WantedConstraints (we
|  |  need these later to produce the correct class constraints on the
|  |  type). In TcExpr.lhs, whenever the tcExpr function encounters a hole,
|  |  it adds the source position with the res_ty and the current tcl_lie to
|  |  the map.
|  |
|  |  After type checking has finished, these types can be taken out of the
|  |  map and shown to the user, however, we are not sure yet where to do
|  |  this. Currently the map is read in tcRnModule and tcRnExpr, so loading
|  |  modules and evaluating expressions with ":t" will show the types of
|  |  the holes in that module or expression. There, we call mkPiTypes,
|  |  mkForAllTys (with the quantified type variables we obtained from the
|  |  WantedConstraints), we zonk and tidy them all (most of this imitates
|  |  how tcRnExpr modifies a type before returning it, except the tidying,
|  |  which needs to pass the updated TidyEnv to the tidying of the next
|  |  hole).
|  |
|  |  Examples:
|  |
|  |  *Main> :t [__, ()]
|  |  tcRnExpr2: [(<interactive>:1:2-3, ())]
|  |  [__, ()] :: [()]
|  |
|  |  *Main> :t map __ __
|  |  tcRnExpr2: [(<interactive>:1:5-6, a0 -> b), (<interactive>:1:8-9, [a0])]
|  |  map __ __ :: [b]
|  |
|  |  Any feedback on this design would be appreciated. We would like to
|  |  know if this is something that could be considered to be added to GHC,
|  |  and what your requirements for that are.
|  |
|  |
|  |
|  |  Also, we have a confusing problem when type checking a module. Above,
|  |  we showed the result of ":t map __ __" in ghci. However, if we put "f
|  |  = map __ __" in a module, we get:
|  |
|  |  tcRnModule: [(f.hs:1:9-10, GHC.Prim.Any * -> b),
|  |  (f.hs:1:12-13, [GHC.Prim.Any *])]
|  |
|  |  If I read GHC.Prim.Any * as forall a. a, then this is not correct: the
|  |  GHC.Prim.Any * in both holes should have the same type. We assume it
|  |  shows up because the type that should be there does not occur in the
|  |  type signature of f (as it's just [b]), but so far we've been unable
|  |  to figure out why this behavior is different in interactive mode. Does
|  |  someone have an idea about what to do to avoid the introduction of
|  |  these GHC.Prim.Any * types?
|  |
|  |  Best regards,
|  |  Thijs Alkemade
|  |
|  |  [1] http://www.haskell.org/pipermail/glasgow-haskell-users/2012-
|  |  January/021453.html
|  |  [2] https://github.com/xnyhps/ghc/commits/master
|  |
|  |  _______________________________________________
|  |  Glasgow-haskell-users mailing list
|  |  Glasgow-haskell-users at haskell.org
|  |  http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
|  
|  
|  
|  _______________________________________________
|  Glasgow-haskell-users mailing list
|  Glasgow-haskell-users at haskell.org
|  http://www.haskell.org/mailman/listinfo/glasgow-haskell-users





More information about the Glasgow-haskell-users mailing list