<div dir="ltr"><div>Why can I not do this?</div><div><br></div><div>data NestedList1 a = Elem a | NList (NestedList1 a)<br></div><div><br></div><div>that is, with parens rather than square brackets, then</div><div><br></div><div>myList2 = (NList (Elem 1, NList (Elem 2, NList (Elem 3, Elem 4), Elem 5)))<br></div><div><br></div><div>It gives the error </div><div><br></div><div><interactive>:383:18-73: error:<br>    ,* Couldn't match expected type `NestedList1 a'<br>                  with actual type `(NestedList1 Integer, NestedList1 a0)'<br>    ,* In the first argument of `NList', namely<br>        `(Elem 1, NList (Elem 2, NList (Elem 3, Elem 4), Elem 5))'<br>      In the expression:<br>        (NList (Elem 1, NList (Elem 2, NList (Elem 3, Elem 4), Elem 5)))<br>      In an equation for `myList2':<br>          myList2<br>            = (NList (Elem 1, NList (Elem 2, NList (Elem 3, Elem 4), Elem 5)))<br>    ,* Relevant bindings include<br>        myList2 :: NestedList1 a (bound at <interactive>:383:1)<br></div><div><br></div><div>etc., etc.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 26, 2021 at 4:05 PM David McBride <<a href="mailto:toad3k@gmail.com">toad3k@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"><div>Right that is a plain list of NestedLists.  So if you were to rewrite [a] as (Regularlist a) so to speak (not a real type), the definition of NestedList would be List (RegularList (NestedList a)).</div><div><br></div><div>Keep in mind that List is a constructor, everything after it is types.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 26, 2021 at 4:50 PM Lawrence Bottorff <<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">So NestedList is using regular List? So in<div><br></div><div>data NestedList a = Elem a | List [NestedList a]<br></div><div><br></div><div>the second data constructor List [NestedList a] we see a "regular" list because of the square brackets?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 26, 2021 at 3:42 PM David McBride <<a href="mailto:toad3k@gmail.com" target="_blank">toad3k@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">In NestedList, the List constructor takes a regular list of NestedLists.  Therefore when pattern matching on it you can get access to those nested lists.  In your code, x is the first NestedList, and xs is the rest of the NestedLists.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 26, 2021 at 4:32 PM Lawrence Bottorff <<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 following <a href="https://wiki.haskell.org/99_questions/Solutions/7" target="_blank">this</a> and yet I see this solution<div><br></div><div>data NestedList a = Elem a | List [NestedList a] deriving (Show)<br></div><div><br></div><div>flatten1 :: NestedList a -> [a]<br>flatten1 (Elem a   )   = [a]<br>flatten1 (List (x:xs)) = flatten1 x ++ flatten1 (List xs)<br>flatten1 (List [])     = []<br></div><div><br></div><div>What I find puzzling is this line</div><div><br></div><div>flatten1 (List (x:xs)) = flatten1 x ++ flatten1 (List xs)<br></div><div><br></div><div>where I see </div><div><br></div><div>(List (x:xs)) as an argument. How is the NestedList type also able to be expressed as a normal consed list with x:xs argument? How is (:) interacting with NestedList?</div><div><br></div><div>LB</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>
_______________________________________________<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>