[GHC] #15471: Polymorphism, typed splices and type inference don't mix

GHC ghc-devs at haskell.org
Wed Sep 5 15:18:11 UTC 2018


#15471: Polymorphism, typed splices and type inference don't mix
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.8.1
       Component:  Template Haskell  |              Version:  8.4.3
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by mpickering):

 Replying to [comment:6 simonpj]:
 > I'm only saying "it's behaving as specified".  (So not a bug in that
 sense.)
 >
 > I think you want to propose an extension to the existing behaviour.
 What is that extension?  Specifically, what type do you expect `test_foo`
 to have?
 >
 > I don't know what this has to do with static forms, but from your `foo`
 I get
 > {{{
 >     • No instance for (Typeable a0)
 >         arising from a static form
 >     • In the expression: static (id :: forall a. a -> a)
 >       In an equation for ‘foo’: foo = static (id :: forall a. a -> a)
 > }}}


 I think that the type of the quote is fine but problem is during the type
 checking of typed splices. The fact that the metaocaml example works also
 supports this I think.

 The relevance of the static form example is that the type of `static id`
 should surely follow the same logic as the type of `[|| id ||]`. The
 inferred type of `static id` is
 `foo :: forall a . (Typeable a, IsStatic t) => t (a -> a)`. It is then
 very surprising when the dereferencing/splicing behaviour differs between
 the cases.

 {{{
 {-# LANGUAGE StaticPointers #-}
 {-# LANGUAGE NoMonomorphismRestriction #-}
 {-# LANGUAGE TemplateHaskell #-}
 module SP where

 foo = static id

 foo2 = [|| id ||]
 }}}

 So I don't have a concrete suggestion to what exactly goes wrong but I
 suspect that the typed splice typechecking code is somehow suspect.

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


More information about the ghc-tickets mailing list