<br>
<div><span class="gmail_quote">On 2/6/08, <b class="gmail_sendername">Chaddaï Fouché</b> &lt;<a href="mailto:chaddai.fouche@gmail.com" target="_blank">chaddai.fouche@gmail.com</a>&gt; wrote:</span> 
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">2008/2/6, Jeff φ &lt;<a href="mailto:jeff1.61803@gmail.com" target="_blank">jeff1.61803@gmail.com</a>&gt;:<br>
&gt; I have solved both of these problems in Clean using a lazy list without<br>&gt; resorting to unsafe operations.&nbsp;&nbsp;So, it seems to me that uniqueness types<br>&gt; are more general than monads.<br><br>Are you aware that your code in Clean has some issues, like the lst<br>
not being so lazy if you operate on ary2 before you operate on lst (it<br>is completely put in memory in this case) ? You&#39;ve effectively created<br>a big uncertainty on the space taken by your function. Is this ok with<br>
you ?</blockquote>
<div>&nbsp;</div>
<div>Yes, I&#39;m aware of this.&nbsp; In a previous post, I wrote, &quot;I should mention that&nbsp;a&nbsp;problem with the code I&#39;ve shown is that it is very sensitive to the order in which the expression graph is evaluated.&nbsp; Simple changes can cause lst to become strict and the program to run out of heap.&quot;&nbsp; However, I think your description of this issue is&nbsp;much more&nbsp;succinct than mine.</div>

<div>&nbsp;</div>
<div>I&#39;m not sure, but I&nbsp;_think_ this problem can be solved using Clean&#39;s strict let-before notation.</div>
<div>&nbsp;</div>
<div><font face="Courier New"><span>normalize_2D_ary ary =<br>&nbsp;&nbsp;&nbsp; #&nbsp; (lst,ary) = uToList_2D ary<br>&nbsp;&nbsp;&nbsp;&nbsp;#! max_elem = foldl1 max lst&nbsp;// max_elem is strict -- lst is consumed.<br></span>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp; map_in_place_2d_arr (\ x -&gt; x / max_elem) ary</font></div>

<div>&nbsp;</div>
<div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">
<div>&nbsp;The monadic fold (like I and some others proposed) guarantee you<br>a constant amount of memory consumed and is perfectly safe too, is the<br>Clean solution really so much better ?</div></blockquote>
<div>&nbsp;</div>
<div>I&#39;m looking forward to spending&nbsp;a few free hours this weekend&nbsp;playing with&nbsp;the monadic fold code.&nbsp; I&#39;ve written a lot of&nbsp;image processing code in Clean that treats&nbsp;images&nbsp;as lists of RGBA tuples.&nbsp; It&#39;s a&nbsp;very useful&nbsp;abstraction.&nbsp; But, I&#39;ve spent more time than I care to admit fixing&nbsp;unexpected stack and heap overflows that were caused by&nbsp;seemingly unrelated code change.&nbsp; I hope to find other abstractions that aren&#39;t&nbsp;so fragile.</div>

<div>&nbsp;</div>
<div>Peter Verswyvelen &lt;<a href="mailto:bf3@telenet.be" target="_blank">bf3@telenet.be</a>&gt; wrote:</div><span style="FONT-SIZE: 11pt; COLOR: #1f497d"><span style="FONT-SIZE: 11pt; COLOR: #1f497d">
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">
<div><span style="FONT-SIZE: 11pt; COLOR: #1f497d"><span style="FONT-SIZE: 11pt; COLOR: #1f497d">Now from the little time I&#39;ve spent in the company of Clean, I must say there&#39;s another advantage of uniqueness typing: it is very easy to understand. While monads are a tiny bit more demanding! But monads give such a mental satisfaction once you see the light &nbsp;;-) </span></span></div>
</blockquote>
<div></div></span></span>&nbsp;</div>
<div>For me, the light is a faint distant flicker.&nbsp; I hope to see it clearer someday.</div>
<div>&nbsp;</div>
<div>At the risk of starting a flame war,&nbsp;being labeled a troll,&nbsp;having Godwin&#39;s law invoked, and suffering a life time ban from&nbsp;Haskell-Cafe, I&#39;d like to broach&nbsp;another subject.&nbsp; I noticed that GHC implements mutable arrays in the IO monad.&nbsp;&nbsp;This seems odd to me.&nbsp;&nbsp;Arrays aren&#39;t related to IO.&nbsp; Are there obstacles&nbsp;to mixing code that uses IO monads and array monads that are most easily worked around&nbsp;by sticking mutable arrays into the IO monad?</div>
</div>