
#16178: Brackets and splices should be overloaded like the static keyword -------------------------------------+------------------------------------- Reporter: mpickering | Owner: (none) Type: feature request | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 8.6.3 Resolution: | Keywords: | TypedTemplateHaskell Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by mpickering): If you define a partially static monoid type such as the following which tries to evaluate as many concatenations statically as possible. {{{ data PS a = Static a | Dynamic (Code a) instance Monoid a => Monoid (PS a) where mempty = Static mempty (Static a) <> (Static b) = Static (a <> b) -- Using the overloading here a <> c = [|| $$a <> $$c ||] lower :: Lift a => PS a -> Code a lower (Static a) = lift a lower (Dynamic c) = c instance IsSplice PS where toBracket = lower instance IsBracket PS where fromBracket = Dynamic sta :: a -> PS a sta = Static }}} Writing programs with this data type becomes much more pleasant as the additional lifting and lowering become transparent. You can combine together these layers multiple times to implicitly perform different rewritings but the client's splice will still end up looking the same. {{{ prog = (sta () <> sta ()) <> [|| () ||] }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/16178#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler