<div id="mb_5">
<div>Thanks to everyone, especially Bulat Ziganshin.</div>
<div>&nbsp;</div>
<div>In <a onclick="return top.js.OpenExtLink(window,event,this)" href="http://haskell.org/haskellwiki/Modern_array_libraries" target="_blank">http://haskell.org/haskellwiki/Modern_array_libraries</a>&nbsp;there is enough information to do what I want.&nbsp; It specifically mentions that it&#39;s OK to pass&nbsp;ByteArray# and MutableByteArray# to an &quot;unsafe foreign&quot; procedure as long as that procedure doesn&#39;t save the pointer, and that worked for me.
</div>
<div>&nbsp;</div>
<div>Here is what I ended up using, which worked great and the FFI usage for a couple of key functions&nbsp;sped up my code by a large factor:</div>
<div>
<div>import Data.Array.Base<br>import Data.Array.IO.Internals<br>import GHC.Exts</div>
<div>&nbsp;</div>
<div>{-# INLINE unsafeByteArrayToPtr #-}<br>unsafeByteArrayToPtr :: IOUArray Int Word32 -&gt; Ptr Word32<br>unsafeByteArrayToPtr (IOUArray (STUArray _ _ array#)) = Ptr (unsafeCoerce# array#)<br>&nbsp;</div></div>
<div>Possibly a better thing to do would be to declare that the call takes a MutableByteArray# directly in the foreign import statement, which I believe would let me avoid using unsafeCoerce# at all, but this was good enough for my purposes.
</div>
<div>&nbsp;</div>
<div>Afterwards I used -ddump-simpl to check on the generated Core for the foreign call and it looked good.</div>
<div>&nbsp;</div>
<div>&nbsp; -- ryan</div>
<div><span class="sg">&nbsp;</span></div></div>