[GHC] #8679: Extend FunD data constructor with information about type signature

GHC ghc-devs at haskell.org
Sat Jan 18 12:05:27 UTC 2014


#8679: Extend FunD data constructor with information about type signature
------------------------------------+-------------------------------------
       Reporter:  jstolarek         |             Owner:
           Type:  feature request   |            Status:  new
       Priority:  normal            |         Milestone:
      Component:  Template Haskell  |           Version:  7.7
       Keywords:                    |  Operating System:  Unknown/Multiple
   Architecture:  Unknown/Multiple  |   Type of failure:  Other
     Difficulty:  Unknown           |         Test Case:
     Blocked By:                    |          Blocking:
Related Tickets:                    |
------------------------------------+-------------------------------------
 I want to propose that `FunD` data constructor in Template Haskell is
 extended with a field that contains that function's type signature (if
 present). Currently the type signature is a separate declaration
 represented with `SigD`. I motivate my proposal with the fact that
 function and its type signature are not independent and it might be the
 case that processing one requires knowledge of the other.

 Here's a concrete example. Recently I've been working together with
 Richard Eisenberg on promoting higher-order functions to the type level.
 To promote a higher order function I need to replace applications of a
 function passed as a parameter with usage of a special `Apply` type
 family. For example the definition of `map`:

 {{{
 map :: (a -> b) -> [a] -> [b]
 map _ [] = []
 map f (x:xs) = f x : map f xs
 }}}

 will be promoted to:

 {{{
 type family Map (f :: (TyFun k1 k2) -> *) (list :: [k1]) :: [k2] where
   Map f '[] = '[]
   Map f (x ': xs) = Apply f x ': Map f xs
 }}}

 To generate equations in the `Map` type family from declarations stored by
 a `FunD` data constructor I need to know that `f` is a function. The only
 way for me to know this is by promoting type signature stored in `SigD`
 and checking the type of `f`. But to promote type signature to a type
 family I need to know the number of patterns in a function clause, which
 again is stored in `FunD`. In other words my algorithm looks like this:

 1. Recover number of patterns in a function clause
 2. Based on number of paterns in function's clause promote the type
 signature to a type family
 3. Based on promoted type signature and definitions in `FunD` generate
 equations in the type family.

 Since `FunD` and `SigD` are independent I need to do three separate passes
 (or two passes + some hacking). If `FunD` contained informatuon about type
 signature I could achieve the same in one pass.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8679>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list