<div dir="ltr">So because <font face="monospace">Onion Shishkebab</font> in the type definition is technically a data constructor <i>function,  </i>the <font face="monospace">(shkb == Onion) </font>in the code is comparing function-to-function, i.e., won't work. Thanks. The light finally went on.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 12, 2021 at 6:28 PM Matthew Low <<a href="mailto:mlow@ualberta.ca">mlow@ualberta.ca</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Pattern matches in Haskell are based on matching specific data constructors, with underscores `_` as a "match anything" mechanism. So one way to achieve something like what you want is</div><div><br></div><div><span style="font-family:monospace">veggieKebab :: Shishkebab -> Bool<br>veggieKebab Skewer = True<br>veggieKebab (Onion (shk)) = veggieKebab shk<br>veggieKebab (Tomato (shk)) = veggieKebab shk<br>veggieKebab _ = False</span></div><div><span style="font-family:arial,sans-serif"><br></span></div><div><span style="font-family:monospace"><span style="font-family:arial,sans-serif">This works because the matches are considered in top-to-bottom order, so the last case only matches if all the others fail to.</span><br></span></div><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">I'm not sure if it helps to build insight or not, but if you look at the the types of your data constructors in GHCI, you get, for example:</font></span></div><div><br></div><div><span style="font-family:monospace">λ> :t Onion</span></div><div><span style="font-family:monospace">Onion :: Shishkebab -> Shishkebab</span></div><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace"><font face="arial,sans-serif">So even if you could pattern match as you wanted (</font><font face="monospace">veggieKebab (shkb (sk)) | (shkb == Onion)), <font face="arial,sans-serif">you'd still be stuck with the problem of trying to compare two functions for equality, which isn't easy (and not something Haskell lets you do for arbitrary functions). You could get close to what you originally wrote by using a few more helper functions:</font></font></span></div><div><span style="font-family:monospace"><font face="monospace"><font face="arial,sans-serif"><br></font></font></span></div><div><span style="font-family:monospace"><font face="monospace"><font face="arial,sans-serif">startsWithOnion :: Shishkebab -> Bool<br>startsWithOnion (Onion _) = True<br>startsWithOnion _ = False<br><br>startsWithTomato :: Shishkebab -> Bool<br>startsWithTomato (Tomato _) = True<br>startsWithTomato _ = False<br><br>restOfKebab :: Shishkebab -> Shishkebab<br>restOfKebab Skewer = Skewer<br>restOfKebab (Onion rst) = rst<br>restOfKebab (Tomato rst) = rst<br>restOfKebab (Lamb rst) = rst<br><br>veggieKebab :: Shishkebab -> Bool<br>veggieKebab Skewer = True<br>veggieKebab kebab | startsWithOnion kebab || startsWithTomato kebab = veggieKebab (restOfKebab kebab)<br>                  | otherwise = False</font></font></span></div><div><span style="font-family:monospace"><font face="monospace"><font face="arial,sans-serif"><br></font></font></span></div><div><span style="font-family:monospace"><font face="monospace"><font face="arial,sans-serif"></font><br></font></span></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 12, 2021 at 9:19 AM Galaxy Being <<a href="mailto:borgauf@gmail.com" target="_blank">borgauf@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I'm trying to translate <i>The Little MLer </i>into Haskell. I've got this<br><div><br></div><div><font face="monospace">data Shishkebab = Skewer | Onion Shishkebab | Lamb Shishkebab | Tomato Shishkebab deriving Show<br></font></div><div><br></div><div>Then I have this which works</div><div><br></div><div><font face="monospace">veggieKebab :: Shishkebab -> Bool<br>veggieKebab Skewer = True<br>veggieKebab (Onion (shk)) = veggieKebab shk<br>veggieKebab (Tomato (shk)) = veggieKebab shk<br>veggieKebab (Lamb (shk)) = False<br></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">> veggieKebab (Tomato (Onion (Tomato (Onion Skewer))))<br>True</font><br></div><div><br></div><div>but I'm wondering if I could do something like this<br></div><div><br></div><div><font face="monospace">veggieKebab :: Shishkebab -> Bool<br>veggieKebab Skewer = True<br>veggieKebab (shkb (sk)) | (shkb == Onion) || (shkb == Tomato) = veggieKebab sk<br>                        | otherwise = False</font><br></div><div><br></div><div><br></div><div>This doesn't work, giving a <font face="monospace">"Parse error in pattern: shkb"</font>. I've been advised that I'm trying to treat what is a data constructor like a variable, but I can't fathom what that means in this case. What I'm trying to leverage is what I've learned from dealing with lists and recursion through the consed list. So if effect I'm trying to recurse through a consed Shishkebab object. It works in the first case, but hyow could I do this in this more generic way like the second try does?</div><div><br></div><div>LB</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>