<div dir="ltr"><div>After further study I believe existentials are not (at least alone) enough to solve the problem.</div><div><br></div><div>They do allow a heterogeneous graph type to be defined and populated:</div><div><br></div><div><font face="monospace, monospace">    :set -XExistentialQuantification </font></div><div><font face="monospace, monospace">    import Data.Graph.Inductive</font></div><div><font face="monospace, monospace">    import Data.Maybe as Maybe</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    data ShowBox = forall s. Show s => SB s</font></div><div><font face="monospace, monospace">    instance Show ShowBox where show (SB x) = "SB: " ++ show x</font></div><div><font face="monospace, monospace">    type ExQuantGraph = Gr ShowBox String</font></div><div><font face="monospace, monospace">    let g = insNode (0, SB 1) </font></div><div><font face="monospace, monospace">            $ insNode (1, SB 'a') </font></div><div><font face="monospace, monospace">            $ empty :: ExQuantGraph</font></div><div><br></div><div>And once you've loaded those ShowBoxes, you can retrieve them:</div><div><br></div><div><font face="monospace, monospace">    getSB :: ExQuantGraph -> Node -> ShowBox</font></div><div><font face="monospace, monospace">    getSB g n = Maybe.fromJust $ lab g n</font></div><div><br></div><div>But you can't unwrap them. The following:</div><div><br></div><div><font face="monospace, monospace">    getInt :: ShowBox -> Int</font></div><div><font face="monospace, monospace">    getInt (SB i) = i</font></div><div><br></div><div>will not compile, because it cannot infer that i is an Int:</div><div><br></div><div><font face="monospace, monospace">    todo/existentials.hs:19:21:</font></div><div><font face="monospace, monospace">        Couldn't match expected type ‘Int’ with actual type ‘s’</font></div><div><font face="monospace, monospace">          ‘s’ is a rigid type variable bound by</font></div><div><font face="monospace, monospace">              a pattern with constructor</font></div><div><font face="monospace, monospace">                SB :: forall s. Show s => s -> ShowBox,</font></div><div><font face="monospace, monospace">              in an equation for ‘getInt’</font></div><div><font face="monospace, monospace">              at todo/existentials.hs:19:13</font></div><div><font face="monospace, monospace">        Relevant bindings include</font></div><div><font face="monospace, monospace">          i :: s (bound at todo/existentials.hs:19:16)</font></div><div><font face="monospace, monospace">        In the expression: i</font></div><div><font face="monospace, monospace">        In an equation for ‘getInt’: getInt (SB i) = i</font></div><div><font face="monospace, monospace">    Failed, modules loaded: none.</font></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 19, 2016 at 2:12 PM, Gesh <span dir="ltr"><<a href="mailto:gesh@gesh.uni.cx" target="_blank">gesh@gesh.uni.cx</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On February 19, 2016 10:54:11 PM GMT+02:00, Francesco Ariis <<a href="mailto:fa-ml@ariis.it">fa-ml@ariis.it</a>> wrote:<br>
>hey Gesh,<br>
><br>
>you are right (not able to compile it atm too, but it looks<br>
>correct and way elegant).<br>
>Maybe post it in the Ml to help OP?<br>
><br>
>ciao ciao<br>
>F<br>
><br>
><br>
>On Fri, Feb 19, 2016 at 04:59:56PM +0200, Gesh wrote:<br>
>> I'm away from compiler at the moment, but...<br>
>> Shouldn't this work?<br>
>> > {-# LANGUAGE GADTs #-}<br>
>> > data NodeS = HamsterS | PersonS<br>
>> > data NodeP a where<br>
>> >   Hamster :: String -> NodeP HamsterS<br>
>> >   Person :: String -> NodeP PersonS<br>
>> > data Node = forall a. NodeP a<br>
>> > type Graph = Gr Node...<br>
>> > hamsters :: NodeP PersonS -> ...<br>
>><br>
>> Basically the idea of that you reify the choice of constructor to the<br>
>type level, permitting static restriction of the constructors used.<br>
>><br>
>> HTH,<br>
>> Gesh<br>
<br>
Oops, meant to send to list.<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Jeffrey Benjamin Brown</div></div>
</div>