<div><span style="color: rgb(160, 160, 168); ">On Thursday, March 15, 2012 at 2:27 PM, Juan Miguel Vilar wrote:</span></div>
                <blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;">
                    <span><div><div><div>Hello, cafĂ©:</div><div><br></div><div>I am trying to use more than one array with runSTUArray but I don't seem</div><div>to be able to understand how it works. My first try is this:</div><div><br></div><div>test1 n = runSTUArray $ do</div><div>              a &lt;- newArray (1, n) (2::Int)</div><div>              b &lt;- newArray (1, n) (3::Int)</div><div>              forM_ [1..n] $ \i -&gt; do</div><div>                v &lt;- readArray a i</div><div>                writeArray b i (v+1)</div><div>              return b</div><div><br></div><div>but it does not work. However, when I write</div></div></div></span></blockquote><div><br></div><div>The problem is that GHC doesn't know what type of array a is. If you provide an annotation, you can resolve the ambiguity:</div><div><br></div><div>a &lt;- newArray (1,n) (2::Int) :: ST s (STUArray s Int Int)</div><div><br></div><div>However, this is somewhat ugly, so we should look at your next example:</div><div>&nbsp;</div><blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;"><span><div><div><div><br></div><div>test2 n = runSTUArray $ do</div><div>              let createArray v n = newArray (1, n) (v::Int)</div><div>              a &lt;- createArray 2 n</div><div>              b &lt;- createArray 0 n</div><div>              forM_ [1..n] $ \i -&gt; do</div><div>                v &lt;- readArray a i</div><div>                writeArray b i (v+1)</div><div>              return b</div></div></div></span></blockquote><div><br></div><div>Note that the type of the b array was never in doubt thanks to runSTUArray. What you've done here is said that the same function that creates b also creates a, and since we know b's type, we now know a's type because GHC doesn't make createArray's type as polymorphic as it might.</div><div><br></div><div>Another approach to resolving the types is to essentially do what you've done in your second example, but give createArray a type that is as polymorphic as you need:</div><div><br></div><div>{-# LANGUAGE FlexibleContexts #-}</div><div><br></div><div><div>newSTUArray :: (MArray (STUArray s) e (ST s), Ix i) =&gt;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(i,i) -&gt; e -&gt; ST s (STUArray s i e)</div><div>newSTUArray = newArray</div><div><br></div><div>test3 n = runSTUArray $ do</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a &lt;- newSTUArray (1, n) False</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b &lt;- newSTUArray (1, n) (3::Int)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; forM_ [1..n] $ \i -&gt; do</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v &lt;- readArray a i</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; writeArray b i (fromEnum v+1)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return b</div></div><div><br></div><div>I hope that helps clear things up. The issue to be aware of, particularly with the Array types, is just how polymorphic the interfaces you rely upon are. The best approach to figuring these problems out is to add type annotations to see where your intuition diverged from the type checker's reality.</div><div><br></div><div>Anthony</div>