The problem is in the reify function:
```
reify :: forall a r. a -> (forall (s :: *). Reifies s a => Proxy s -> r) -> r
reify a k = unsafeCoerce (Magic k :: Magic a r) (const a) Proxy
```
here, unsafeCoerce coerces `const a` to type `a`, in the concrete case, to Int.
```
*Main> unsafeCoerce (const 5) :: Int
1099511628032
```
this is indeed what seems to be the issue:
```
*Main> reify 5 reflect
1099511628032
```
which is why test1 then shows the wrong result.
Also, in the Magic newtype, there’s a `Proxy s`, which afaik doesn’t have the expected runtime representation
`a -> r`. (there’s a proxy in the middle, `a -> Proxy -> r`).
Changing Magic to
```
newtype Magic a r = Magic (forall (s :: *) . Reifies s a => Tagged s r)
```
now has the correct runtime rep, and the reification can be done by coercing the Magic in to `a -> r`, as such
```
reify' :: a -> (forall (s :: *) . Reifies s a => Tagged s r) -> r
reify' a f = unsafeCoerce (Magic f) a
```
the Proxy version is just a convenience, wrapped around the magic one:
```
reify :: forall r a. a -> (forall (s :: *) . Reifies s a => Proxy s -> r) -> r
reify a f = reify' a (unproxy f)
```
Here’s the complete file, with the changes that compile and now work:
— Csongor
I modified the example on the wiki to compile but I seem to have
missed something, could you perhaps point out what I missed?
https://gist.github.com/mpickering/da6d7852af2f6c8f59f80ce726baa864```
*Main> test1 2 123 441212
441335
```
On Thu, Jan 19, 2017 at 3:58 AM, David Feuer <david@well-typed.com> wrote:
I've updated https://ghc.haskell.org/trac/ghc/wiki/MagicalReflectionSupport to
reflect both Simon's thoughts on the matter and my own reactions to them. I
hope you'll give it a peek.
David Feuer
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs