<div dir="ltr">Hi Jeffrey,<div><br></div><div>what you want to do is not possible with the graph type that you say FGL provides. FGL simply requires that all node types have to be equal, so it can't preserve the information that your graph is biparite, no matter what language features you use to define the node type. </div><div><br></div><div>Benno</div><br><div class="gmail_quote"><div dir="ltr">Benjamin Edwards <<a href="mailto:edwards.benj@gmail.com">edwards.benj@gmail.com</a>> schrieb am So., 21. Feb. 2016 um 12:30 Uhr:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Sorry Jeffrey, I haven't been following the thread too closely, I just threw that out there as a way to recover an existential type through pattern matching. It's a cool feature of GADTs. I'm not sure it necessarily gets you too much in your specific problem.</div><br><div class="gmail_quote"><div dir="ltr">On Sun, 21 Feb 2016 at 02:27 Jeffrey Brown <<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Clever! That answers my first question, but still leaves me unmotivated. Would GADTs allow me to offload some kind of work onto the compiler that I currently have to do myself?</div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 20, 2016 at 2:00 PM, Matt <span dir="ltr"><<a href="mailto:parsonsmatt@gmail.com" target="_blank">parsonsmatt@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>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><div dir="ltr"><div>Matt Parsons</div></div></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><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><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" 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>
<br></blockquote></div><br></div></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></blockquote></div>
_______________________________________________<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>
</blockquote></div></div>