<div dir="ltr"><div>The pattern I've seen is:</div><div><br></div><div>data Some f where</div><div>   Some :: f a -> Some f</div><div><br></div><div>type G = Gr (Some Box') String</div><div><br>Ordinarily you lose the information about the `a`, but when you have a GADT, that allows you to recover type information. So you can match on:</div><div><br></div><div>f :: Some Box' -> String<br>f (Some (Bi i)) = show (i + 1)<br>f (Some (Bs s)) = s</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div>Matt Parsons</div></div></div></div>
<br><div class="gmail_quote">On Sat, Feb 20, 2016 at 4:16 PM, Jeffrey Brown <span dir="ltr"><<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Interesting! I have two questions.<br></div><div><br></div><div>(1) Given that Graph is of kind * -> * -> *, rather than (* -> *) -> * -> *, how can I use a GADT? The first graph using existentials defined earlier in this thread looked like:</div><div><br></div><div><font face="monospace, monospace">    data Box = forall s. Show s => Box s</font></div><div><font face="monospace, monospace">    type ExQuantGraph = Gr Box String</font></div><div><br></div><div>If instead I use a GADT:</div><div><br></div><div><font face="monospace, monospace">    data Box' a where</font></div><div><font face="monospace, monospace">      Bi :: Int -> Box' Int</font></div><div><font face="monospace, monospace">      Bs :: String -> Box' String</font></div><div><br></div><div>then I can't define a graph on </div><div><br></div><div><font face="monospace, monospace">    type G = Gr Box' String</font></div><div><br></div><div>because Box is not a concrete type. I could specify (Box a) for some a, but then I lose the polymorphism that was the purpose of the GADT.</div><div><br></div><div>(2) Would a GADT be better than what I'm already doing? Currently I define a Mindmap[1] as a graph where the nodes are a wrapper type called Expr ("expression"):</div><div><br></div><div><font face="monospace, monospace">    type Mindmap = Gr Expr _ -- the edge type is irrelevant</font></div><div><font face="monospace, monospace">    data Expr = Str String | Fl Float</font></div><div><font face="monospace, monospace">              | Tplt [String] | Rel | Coll</font></div><div><font face="monospace, monospace">              | RelSpecExpr RelVarSpec deriving(Show,Read,Eq,Ord)</font></div><div><br></div><div>I do a lot of pattern matching on those constructors. If I used a GADT I would still be pattern matching on constructors. So do GADTs offer some advantage?</div><div><br></div><div>[1] <a href="https://github.com/JeffreyBenjaminBrown/digraphs-with-text/blob/master/src/Dwt/Graph.hs" target="_blank">https://github.com/JeffreyBenjaminBrown/digraphs-with-text/blob/master/src/Dwt/Graph.hs</a></div></div><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">On Sat, Feb 20, 2016 at 11:59 AM, Benjamin Edwards <span dir="ltr"><<a href="mailto:edwards.benj@gmail.com" target="_blank">edwards.benj@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">if you are willing to have a closed universe, you can pattern match on a gadt to do do the unpacking</div><br><div class="gmail_quote"><div><div><div dir="ltr">On Sat, 20 Feb 2016 at 19:19 Jeffrey Brown <<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>> wrote:<br></div></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Yes, that is my point. Existentials cannot be unwrapped.</div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 20, 2016 at 4:18 AM, Kosyrev Serge <span dir="ltr"><<a href="mailto:_deepfire@feelingofgreen.ru" target="_blank">_deepfire@feelingofgreen.ru</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>Jeffrey Brown <<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>> writes:<br>
> After further study I believe existentials are not (at least alone)<br>
> enough to solve the problem.<br>
</span>..<br>
<span>> getInt :: ShowBox -> Int<br>
> getInt (SB i) = i<br>
><br>
> will not compile, because it cannot infer that i is an Int:<br>
<br>
</span>You take a value of an existentially quantified type (which means it<br>
can be anything at all, absent some extra context) and *proclaim* it<br>
is an integer.<br>
<br>
On what grounds should the compiler accept your optimistic restriction?<br>
<div><div><br>
--<br>
с уважениeм / respectfully,<br>
Косырев Сергей<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div></div><div class="gmail_extra">-- <br><div><div dir="ltr">Jeffrey Benjamin Brown</div></div>
</div></div></div><span>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">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>
</span></blockquote></div>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div><div dir="ltr">Jeffrey Benjamin Brown</div></div>
</font></span></div>
<br>_______________________________________________<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>
<br></blockquote></div><br></div>