Understanding bind in template haskell

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Understanding bind in template haskell

Yotam Ohad
Hi,
In the function DsMeta.repE there is a format being repeated:
For example in:

repE e@(ExplicitTuple _ es boxed)
  | not (all tupArgPresent es) = notHandled "Tuple sections" (ppr e)
  | isBoxed boxed = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]
                       ; repTup xs }
  | otherwise     = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]
                       ; repUnboxedTup xs }

There is  `(dL->L _ (Present _ e)) <- es`. I don't understand how this type checks correctly.
If I'll try to do

 data Foo a = Foo a
runQ [| Foo b <- Foo 1 |]

in ghciI get an error. What is the difference?

Yotam

_______________________________________________
ghc-devs mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
Reply | Threaded
Open this post in threaded view
|

Re: Understanding bind in template haskell

Michael Sloan
Hi Yotam,

Template Haskell expression quotes must start with either `[|` or
`[e|`, but instead these start with `[e |` - note the space. They are
list comprehensions which filter to just the elements of `es` that
match the `(dL -> L _ (Present _ e))`.  Also, the `dL -> ...` portion
is a view pattern that is equivalent to `id`, since since the
arguments are already wrapped in `L`.

For something like `runQ [| Foo b <- Foo 1 |]` to work, there'd need
to be a quotation for `Stmt`, but there are only quotations for `Exp`
/ `[Dec]` / `Type` / `Pat`.

I hope that's helpful!

-Michael


On Sat, Dec 8, 2018 at 3:30 AM Yotam Ohad <[hidden email]> wrote:

>
> Hi,
> In the function DsMeta.repE there is a format being repeated:
> For example in:
>
> repE e@(ExplicitTuple _ es boxed)
>   | not (all tupArgPresent es) = notHandled "Tuple sections" (ppr e)
>   | isBoxed boxed = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]
>                        ; repTup xs }
>   | otherwise     = do { xs <- repLEs [e | (dL->L _ (Present _ e)) <- es]
>                        ; repUnboxedTup xs }
>
> There is  `(dL->L _ (Present _ e)) <- es`. I don't understand how this type checks correctly.
> If I'll try to do
>
>  data Foo a = Foo a
> runQ [| Foo b <- Foo 1 |]
>
> in ghciI get an error. What is the difference?
>
> Yotam
> _______________________________________________
> ghc-devs mailing list
> [hidden email]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs