| > Hang on! The design for typed splices, describe here, | > https://ghc.haskell.org/trac/ghc/wiki/TemplateHaskell/BlogPostChanges | > says "Unlike TH, the only way to construct a value of type TExp is | with a quote. You cannot drop into do-notation, nor use explicit | construction of the values in the Exp algebraic data type. That | restriction limits expressiveness, but it enables the strong typing | guarantees." | > | > So why does the above work? $$(e) requires a TExp, and do-notation | doesn’t produce a TExp. | | Indeed this is true -- this is what that page says. But it's not what's | implemented: when I say $$( _ ) :: Bool, GHC tells me that the hole has | type Q (TExp Bool). | There still is no way to create a TExp other than to use a type TH quote
Humph. I suppose that provided you can't forge a TExp, there's no way to splice in a type-incorrect program; and having Q available lets you (say) do input/output or consult the context to decide which of two quotes to return. We could do this selectively. For example we'd certainly need (TExp t) to be able to fail > bool :: String -> TExp Bool > bool "true" = [|| True ||] > bool "false" = [|| False ||] > bool _ = failTexp "not a bool" My instinct is to make it less expressive, though, and only allow (TExp t) as the argument of $$. Does anyone care either way? I suppose we'd better open a ticket for this. Simon | | quote. | | Addressing your other message: a typed quasiquoter would be somewhat | limited, but not utterly silly. For example, this works: | | > bool :: String -> Q (TExp Bool) | > bool "true" = [|| True ||] | > bool "false" = [|| False ||] | > bool _ = fail "not a bool" | > | > -- and then, in another module because of the stage restriction: | > yes :: Bool | > yes = $$(bool "true") | | Now `bool` could be a typed quasiquoter. | | I don't know whether any of this is worth implementing, but it's not, a | priori, a terrible idea. | | Richard | | > | > | * Should we consider it a bug (and file a ticket) that reification | > | in typed splices is able to observe the order of type checking, | > | just like reify used to do in untyped splices? | > | > Yes I think so!!! | > | > Simon | > _______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
