[GHC] #10891: `reify` doesn't find associated type families

GHC ghc-devs at haskell.org
Thu Sep 17 17:53:41 UTC 2015


#10891: `reify` doesn't find associated type families
-------------------------------------+-------------------------------------
              Reporter:  antalsz     |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Template    |           Version:  7.10.2
  Haskell                            |
              Keywords:  template    |  Operating System:  Unknown/Multiple
  haskell; type families             |
          Architecture:              |   Type of failure:  Incorrect result
  Unknown/Multiple                   |  at runtime
             Test Case:              |        Blocked By:
              Blocking:              |   Related Tickets:
Differential Revisions:              |
-------------------------------------+-------------------------------------
 Template Haskell's `reify` doesn't find the the associated type families
 of a type class.  Consider the following two classes:

 {{{#!hs
 class C a where
   f :: a -> Int

 class C' a where
   type F a :: *
   f' :: a -> Int
 }}}

 These produce identical, up to renaming, output when passed to `reify`:

 {{{#!hs
 -- putStrLn $(stringE . show =<< reify ''C)
 ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] []
                [SigD Ghci1.f
                      (ForallT [PlainTV a_1627398388]
                               [ClassP Ghci1.C [VarT a_1627398388]]
                               (AppT (AppT ArrowT (VarT a_1627398388))
                                     (ConT GHC.Types.Int)))])
        []

 -- putStrLn $(stringE . show =<< reify ''C')
 ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
                [SigD Ghci3.f'
                      (ForallT [PlainTV a_1627405973]
                               [ClassP Ghci3.C' [VarT a_1627405973]]
                               (AppT (AppT ArrowT (VarT a_1627405973))
                                     (ConT GHC.Types.Int)))])
        []
 }}}

 If I know the name of `F`, I can look up information about it:

 {{{!#hs
 -- putStrLn $(stringE . show =<< reify ''F)
 FamilyI (FamilyD TypeFam
                  Ghci3.F
                  [PlainTV a_1627405973]
                  (Just StarT))
         []
 }}}

 But I can't find the name of `F` in the first place.  Even if I add an
 instance of the type class, the `InstanceD` has none of the information
 about the definition.  Given

 {{{#!hs
 instance C' [a] where
   type F [a] = a
   f' = length
 }}}

 we get

 {{{#!hs
 -- putStrLn $(stringE . show =<< reify ''C')
 ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
                [SigD Ghci3.f'
                      (ForallT [PlainTV a_1627405973]
                               [ClassP Ghci3.C' [VarT a_1627405973]]
                               (AppT (AppT ArrowT (VarT a_1627405973))
                                     (ConT GHC.Types.Int)))])
        [InstanceD []
                   (AppT (ConT Ghci3.C')
                         (AppT ListT (VarT a_1627406161)))
                   []]
 }}}

 This problem was confirmed to exist in the following configurations:

 * GHC 7.10.2 with version 2.10.0.0 of the template-haskell package.
 * GHC 7.8.3 with version 2.9.0.0 of the template-haskell package.
 * GHC 7.4.2 with version 2.7.0.0 of the template-haskell package.

 (I also posted this on Stack Overflow in //2013//, where it has been
 languishing ever since: http://stackoverflow.com/q/17247880/237428.)

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


More information about the ghc-tickets mailing list