
#7015: Add support for 'static' -------------------------------------+------------------------------------- Reporter: edsko | Owner: Type: feature | Status: patch request | Milestone: 7.10.1 Priority: normal | Version: 7.4.2 Component: Compiler | Keywords: Resolution: | Architecture: Unknown/Multiple Operating System: | Difficulty: Unknown Unknown/Multiple | Blocked By: Type of failure: | Related Tickets: None/Unknown | Test Case: | Blocking: | Differential Revisions: Phab:D119 | -------------------------------------+------------------------------------- Comment (by facundo.dominguez): When trying to do floating in the desugarer I arrived at a point where I need evidence bindings to desugar. For instance, when encountering the expression `static return :: Ref (a -> IO a)`, the desugarer tries to float `return` as {{{ Main.static:0 :: forall a_azE. a_azE -> GHC.Types.IO a_azE Main.static:0 = \ (@ a_azE) -> GHC.Base.return @ GHC.Types.IO $dMonad_azG @ a_azE }}} where `$dMonad_azG` is a variable carrying the `Monad IO` dictionary. As `$dMonad_azG` is not in scope the above code is rejected by the Core Lint pass. When floating is done in the typechecker, the binding of `$dMonad_azG` is produced by `simplifyInfer` in `checkStaticValues` at the place where the floated bindings for static forms are assembled. Further down the processing, desugaring inserts this evidence binding as a core `let` binding in the rhs of `static:0`, subsequently inlined to yield something like: {{{ Main.static:0 :: forall a_azE. a_azE -> GHC.Types.IO a_azE Main.static:0 = \ (@ a_azE) -> GHC.Base.return @ GHC.Types.IO GHC.Base.$fMonadIO @ a_azE }}} Now, to do floating in the desugarer, it looks like evidence bindings need to be communicated to the place in the desugarer (I presume `dsExpr`) where the floating should be implemented. Would there be a preferred way to do it? I couldn't find precedents of similar needs in the ghc code. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/7015#comment:15 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler