<div dir="ltr">Chaddaï and Richard, <br><br>Both your reply&#39;s helped me alot! It is so much different then imperative programming, and i say it as a good thing. I still have lots to learn, but its just like math, it looks so obvious when you see the solution, but entirely different when you have to face it yourself, another point of similarity with math, the more you practice, the better you get :)<br>

<br>Richard, your definition of  List_Or t made the coin drop in my head (since i knew almost nothing about datatypes), and I has managed to write a little &quot;flatten&quot; function for these nested lists. I am now trying to think how to make my solution nicer (hehe dont spoil it yet by showing me yours yet! :) )<br>

<br>You all have a great weekend,<br>Vadali<br><br><br><br><div class="gmail_quote">On Wed, Jul 14, 2010 at 12:09 PM, Chaddaï Fouché <span dir="ltr">&lt;<a href="mailto:chaddai.fouche@gmail.com">chaddai.fouche@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div class="im">On Tue, Jul 13, 2010 at 11:28 AM, Shlomi Vaknin &lt;<a href="mailto:shlomivaknin@gmail.com">shlomivaknin@gmail.com</a>&gt; wrote:<br>


&gt; Thank you Bob,<br>
&gt; your example clarified how actually using such data type would appear in<br>
&gt; haskell. I naively thought it would be as simple as defining a regular list,<br>
&gt; but i see it is slightly more strict than that. I appreciate your help!<br>
&gt; Vadali<br>
<br>
</div>Well it _is_ as simple as defining a regular list, which would be<br>
(fictionally since (:) and [] are reserved identifiers) :<br>
<br>
&gt; data [] a = [] | a : [a]<br>
<br>
Which is the same as :<br>
<br>
&gt; data List a = Empty | Cons a (List a)<br>
<br>
You can then handle lists with pattern matching :<br>
<br>
&gt; map f [] = []<br>
&gt; map f (x:xs) = f x : map f xs<br>
<br>
Or for our List type :<br>
<br>
&gt; map f Empty = Empty<br>
&gt; map f (Cons x xs) = Cons (f x) (map f xs)<br>
<br>
<br>
His definition of a tree :<br>
<div class="im"><br>
&gt; data Tree a = Leaf | Branch a [Tree a]<br>
<br>
</div>follows the same idea and is as easy to handle with pattern matching :<br>
<br>
&gt; treeMap f Leaf = Leaf<br>
&gt; treeMap f (Branch x xs) = Branch (f x) (map (treeMap f) xs)<br>
<br>
<br>
As you see, an user defined type is manipulated with the same<br>
mechanism as a &quot;primitive&quot; type, this uniformity is part of the power<br>
of Haskell in that it encourages users to create their types and<br>
allows seamless integration of external library types with &quot;primitive&quot;<br>
types.<br>
<font color="#888888"><br>
--<br>
Jedaï<br>
</font></blockquote></div><br><div style="visibility: hidden; display: inline;" id="avg_ls_inline_popup"></div><style type="text/css">#avg_ls_inline_popup {  position:absolute;  z-index:9999;  padding: 0px 0px;  margin-left: 0px;  margin-top: 0px;  width: 240px;  overflow: hidden;  word-wrap: break-word;  color: black;  font-size: 10px;  text-align: left;  line-height: 13px;}</style></div>