<div class="gmail_quote">On Fri, Jun 5, 2009 at 4:13 PM, Jason Dagit <span dir="ltr">&lt;<a href="mailto:dagit@codersbase.com">dagit@codersbase.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br><br><div class="gmail_quote"><div class="im">On Fri, Jun 5, 2009 at 2:58 PM, MH <span dir="ltr">&lt;<a href="mailto:mhamro@gmail.com" target="_blank">mhamro@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I actually meant<br>
<br>
data Container a = Many a(Container a)<br>
<br>
but here is what I don&#39;t understand (fyi, I am a beginner) how can you<br>
construct  this container? I can do</blockquote><div><br></div></div><div>I think I saw the above definition described as a coalgebra or codata:</div><div><a href="http://blog.sigfpe.com/2007/07/data-and-codata.html" target="_blank">http://blog.sigfpe.com/2007/07/data-and-codata.html</a><br>

</div><div><br></div><div>Basically, that list has to always be infinite.</div><div class="im"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
let a = Many &quot;somestring&quot; - and I will get back a function but I can not do<br>
let a = Many &#39;a&#39; &quot;somestring&quot;  - because the second param is not<br>
(Container a) type.<br>
let a = Many &#39;a&#39; (Container [&#39;a&#39;,&#39;a&#39;]) - doesn&#39;t work either because<br>
Container is a type not a constructor (right or I am missing<br>
something?).<br>
<br>
So I have two questions:<br>
1. When I do<br>
let b = Many &quot;somestring&quot; , I get<br>
:t b<br>
b :: Container[Char] -&gt; Container[Char]<br>
what is it and why I am allowed to pass just one parameter to Many<br>
(and how can I use it)?<br>
<br>
2. How can you construct that container?<br>
data Container a = Many a(Container a)<br>
let a = ????<br>
<div><div></div><div></div></div></blockquote><div><br></div></div><div>Check that link above for answers to some of your questions.</div><div><br></div><div>I think that basically you want a different type:</div><div>
data NonEmptyList a = JustOne a | MoreThanOne a (NonEmptyList a)</div></div></blockquote><div><br></div><div>I am still not sure why so much attention is being given to the recursive version.  I find the most elegant and useful to be this simple one:</div>
<div><br></div><div>  data NonEmpty a = NonEmpty a [a]</div><div><br></div><div>With the obligatory conversions:</div><div><br></div><div>toList (NonEmpty x xs) = x:xs</div><div>fromList [] = Nothing</div><div>fromList (x:xs) = Just (NonEmpty x xs)</div>
<div><br></div><div>Luke</div></div>