<span style="font-family: courier new,monospace;">Après avoir un peu manipulé la solution de John pour qu&#39;elle fasse la même chose que la mienne, je peux affirmer qu&#39;elle est légèrement moins rapide (c&#39;est infime et normal vu que ses leftFold passent plus d&#39;informations), mais que les deux solutions ont au moins cet avantage d&#39;être rapides (2s sur 10M de Double) et en mémoire parfaitement constante :<br>
<br>----<br>import Data.Array.MArray</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">import Control.Monad</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">import <a href="http://Data.Array.IO">Data.Array.IO</a></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">import System</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">maxArr a = liftM (foldl1&#39; max) (getElems a)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">foldlA :: (MArray a e m, Ix i) =&gt; (r -&gt; e -&gt; r) -&gt; r -&gt; a i e -&gt; m r</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">foldlA f a arr = getBounds arr &gt;&gt;= </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foldM (\a-&gt;a `seq` liftM $ f a) a </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&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; . map (readArray arr) . range</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">foldl1A :: (MArray a e m, Ix i) =&gt; (e -&gt; e -&gt; e) -&gt; a i e -&gt; m e</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">foldl1A f arr = flip (foldlA f) arr =&lt;&lt; readArray arr . fst =&lt;&lt; getBounds arr</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">foldMA :: (MArray a e m, Ix i) =&gt; (r -&gt; e -&gt; m r) -&gt; r -&gt; a i e -&gt; m r</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">foldMA f a arr = getBounds arr &gt;&gt;= </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foldM (\a-&gt;a `seq` (&gt;&gt;= f a)) a </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&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; . map (readArray arr) . range</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 f arr = mapM_ (modifyElement f arr) . range =&lt;&lt; getBounds 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 f arr i = writeArray arr i . f =&lt;&lt; readArray arr i</span><span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">main = do</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;[n] &lt;- getArgs</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;a &lt;- (newListArray (0, 10 ^ read n) [1..] :: IO (IOUArray Int Double))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;maxE &lt;- foldl1A max a</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;modifyArray (* (1/maxE)) a</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;print =&lt;&lt; readArray a (10 ^ read n)<br>
----<br><br>En tout cas il serait agréable d&#39;avoir quelques unes de ces fonctions dans les librairies standards, vu qu&#39;elles sont généralement utiles et très efficace. Je n&#39;utilise pas les langages fonctionnels pour avoir à écrire des boucles explicites sur mes structures de données !! ;-)<br>
(et comme on l&#39;a vu, pour un débutant, l&#39;écriture d&#39;une généralisation <span style="font-weight: bold;">efficace</span> de ces boucles n&#39;est pas si triviale qu&#39;il y paraît).<br><br>-- <br>Jedaï<br></span>