
#16178: Brackets and splices should be overloaded like the static keyword -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: feature | Status: new request | Priority: normal | Milestone: Component: Template | Version: 8.6.3 Haskell | Keywords: | Operating System: Unknown/Multiple TypedTemplateHaskell | Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- It's quite convenient that the `static` keyword is rebindable. To recap, if `e :: T` then `static e :: (IsStatic p) => p t`. It should also be possible rebind brackets and splices in the same manner. So we introduce two type classes `IsBracket` and `IsSplice`. Now quoting a term `e :: T` has type `e :: IsBracket p => p T` and the argument to a splice must have type `e :: IsSplice p => p T` which results in a value of type `T`. {{{ class IsBracket p where fromBracket :: Code t -> p t class IsSplice p where toBracket :: p t -> Code t foo :: IsBracket p => p Int foo = [|| 5 ||] qux :: (IsSplice p, IsBracket p) => Int qux = $$(foo) }}} As an aside, arguably the `static` form should only be rebindable when `RebindableSyntax` is enabled but that boat seems to have sailed. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16178 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler