On Fri, Mar 27, 2009 at 7:03 PM, Henning Thielemann <span dir="ltr">&lt;<a href="mailto:lemming@henning-thielemann.de">lemming@henning-thielemann.de</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im"><br>
On Thu, 26 Mar 2009, wren ng thornton wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thomas Hartman wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Luke, does your explanation to Guenther have anything to do with<br>
coinduction? -- the property that a producer gives a little bit of<br>
output at each step of recursion, which a consumer can than crunch in<br>
a lazy way?<br>
</blockquote>
<br>
It has more to do with &quot;tying the knot&quot; (using laziness to define values in terms of themselves), though there are similarities. Take the function:<br>
<br>
   infZipWith f ~(x:xs) ~(y:ys) = f x y : infZipWith f xs ys<br>
</blockquote>
<br></div>
What about using a custom list type, that has only one constructor like (:), that is, a type for infinite lists?<br></blockquote><div><br>Yes, that would be more correct.  However, the lazy pattern match would still be necessary, because single-constructor types are lifted.  And as long as you&#39;re doing that, you might as well go all the way to an infinite binary trie.<br>
<br>Luke</div></div><br>