Sorry, I was lazy. New maximum&#39;:<br><span style="font-family: courier new,monospace;">maximum&#39; = foldl1&#39; max</span><br><br><div><span class="gmail_quote">On 02/02/2008, <b class="gmail_sendername">Rodrigo Queiro</b> &lt;<a href="mailto:overdrigzed@gmail.com">overdrigzed@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
This is my attempt at some nicer code:<br><br><span style="font-family: courier new,monospace;">maximum&#39; (x:xs) = foldl&#39; max x xs</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">maximum&#39; _ = undefined</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">modifyArray :: (MArray a e m, Ix i) =&gt; (e -&gt; e) -&gt; a i e -&gt; m ()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">modifyArray fn arr = do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;bounds &lt;- getBounds arr</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;forM_ (range bounds) (modifyElement fn arr)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">modifyElement :: (MArray a e m, Ix i) =&gt; (e -&gt; e) -&gt; a i e -&gt; i -&gt; m ()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">modifyElement fn arr i = do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;x &lt;- readArray arr i</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;writeArray arr i (fn x)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">normalizeArray :: (MArray a e m, Ix i, Fractional e, Ord e) =&gt; a i e -&gt; m ()</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">normalizeArray arr = do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;arr_elems &lt;- getElems arr</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;let max_elem = maximum&#39; arr_elems</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;modifyArray (/max_elem) arr</span><div>
<span class="e" id="q_117da395b75f47e0_1"><br>
<br>On 02/02/2008, Jeff φ &lt;<a href="mailto:jeff1.61803@gmail.com" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">jeff1.61803@gmail.com</a>&gt; wrote:<br>&gt; Hello,<br>&gt; <br>&gt; I&#39;m trying to write code that will take a mutable 2D array and normalize it<br>

&gt; by dividing all elements by the largest element.&nbsp;&nbsp;<br>&gt; <br>&gt; I managed to write code to do this, but it seems overly complex.&nbsp;&nbsp;I could<br>&gt; write something much simpler in Clean or C++.&nbsp;&nbsp;Most likely, my code is<br>

&gt; complex because I don&#39;t have any experience with mutable arrays in Haskell. <br>&gt; I couldn&#39;t find any tutorials on the Internet.&nbsp;&nbsp;I&#39;d be grateful for<br>&gt; suggestions on simplifying the following code.&nbsp;&nbsp; Thanks.<br>

&gt;&nbsp;&nbsp;<br>&gt; <br>&gt; {-# OPTIONS_GHC -fglasgow-exts -fbreak-on-exception #-}<br>&gt; <br>&gt; -- normalize_ary This takes a mutable array.&nbsp;&nbsp;Determines the largest<br>&gt;&nbsp;&nbsp;-- element in the array (max_elem) and then divides every element by<br>

&gt; -- max_elem.<br>&gt;&nbsp;&nbsp;normalize_ary :: (Num t1,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Num t,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ix t,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ix t1,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MArray a e t2,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ord e,<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fractional e,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enum t,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enum t1) =&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a (t, t1) e -&gt; t2 ()<br>&gt;&nbsp;&nbsp;normalize_ary ary = <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; do&nbsp;&nbsp;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- The following two commented out lines of code show my first<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- attempt at determining a value for max_elem.&nbsp;&nbsp;However, this<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- produces a stack overflow.<br>&gt; <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- elem_ary &lt;- getElems ary <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- let max_elem = foldl1 max elem_ary<br>

&gt; <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; max_elem &lt;- calc_max_2d_elem ary<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_elem `seq` map_in_place_2d_arr (\x -&gt; x / max_elem) ary<br>&gt; <br>&gt; <br>&gt;&nbsp;&nbsp;map_in_place_2d_arr :: (MArray a e t, Enum t2, Enum t1, Ix t1, Ix t2) =&gt;<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(e -&gt; e) -&gt; a (t1, t2) e -&gt; t ()<br>&gt;&nbsp;&nbsp;map_in_place_2d_arr fn arr = ret<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; where <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = do ((i1,j1),(i2,j2)) &lt;- getBounds arr<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( mapM_ (\i -&gt;&nbsp;&nbsp;do v &lt;- readArray arr i<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeArray arr i (fn v)<br>&gt; )<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(i,j) | i &lt;- [i1..i2], j &lt;- [j1..j2]])<br>&gt;&nbsp;&nbsp;<br>&gt; <br>&gt; calc_max_2d_elem :: (Ord t, MArray a t t1, Ix t2, Ix t3, Num t3, Num t2) =&gt;<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a (t3, t2) t -&gt; t1 t<br>&gt; calc_max_2d_elem arr = <br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do m &lt;- readArray arr (0,0)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(_,(i_max, j_max)) &lt;- getBounds arr<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let calc_max_loop arr m (i,j)<br>

&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| j == j_max&nbsp;&nbsp;&nbsp;&nbsp; = return m<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= do e &lt;- readArray arr (i,j)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let m2 = max e m<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m2 `seq` calc_max_loop<br>

&gt; arr m2 nxt_idx<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where nxt_idx | i == i_max - 1 = (0,j+1)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (i+1,j)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calc_max_loop arr m (0,0)<br>&gt;&nbsp;&nbsp;<br>&gt;&nbsp;&nbsp;<br></span></div>&gt; _______________________________________________<br>

&gt; Haskell-Cafe mailing list<br>&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Haskell-Cafe@haskell.org</a><br>&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>

&gt; <br>&gt; <br>
</blockquote></div><br>