Brackets and splices should be overloaded like the static keyword
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.
Trac metadata
Trac field | Value |
---|---|
Version | 8.6.3 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Template Haskell |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |