<div dir="ltr">First of all, the current standard for arrays is the <a href="https://hackage.haskell.org/package/vector">vector</a> package, array is pretty obsolete. Secondly, are you sure you want your functions to take both immutable and mutable arrays? You could just make them take immutable ones, and convert using <a href="https://hackage.haskell.org/package/vector-0.11.0.0/docs/Data-Vector.html#g:38">(unsafe)freeze/thaw</a> beforehand. Also, since you know that you'll only be storing Face and Vertex, you might as well make an Unbox (or Storable) instance for them and use Unboxed (or Storable) vectors.<br><div><br></div><div>Then you end up with:</div><div><br></div><div>import qualified Data.Vector.Unboxed as VU</div><div><br></div><div>data Surface = Surface { vertices :: VU.Vector Vertex, faces :: VU.Vector Face }</div><div><br></div><div>render :: Surface -> IO ()</div><div><br></div><div>etc.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 12, 2016 at 7:12 AM, Christopher Howard <span dir="ltr"><<a href="mailto:ch.howard@zoho.com" target="_blank">ch.howard@zoho.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi. I recently learned how to use Haskell IArrays and MArrays, and they<br>
are quite convenient. I find myself often using some type of MArray for<br>
performance reasons, but also some IArray type for array data that is<br>
static in a set of computations.<br>
<br>
Then I started wanting to use arrays inside other kinds of data types,<br>
and so quickly ran into the question: what do you do if you want a data<br>
type to contain an array, but you don't know in advance what array type<br>
you'll be working with (immutable vs. mutible, boxed vs. unboxed).<br>
<br>
My exploration of this question led to discovering something called<br>
GADTs, which allowed me to do definitions like so<br>
<br>
data Surface a where<br>
  ISurface :: IArray a e => (a Int Vertex) -> (a Int Face) -> Surface a<br>
  MSurface :: MArray a e m => (a Int Vertex) -> (a Int Face) -> Surface a<br>
<br>
Am I heading down the right track here, or is there some better approach?<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
<a href="https://qlfiles.net" rel="noreferrer" target="_blank">https://qlfiles.net</a><br>
My PGP public key ID is 0x340EA95A (<a href="http://pgp.mit.edu" rel="noreferrer" target="_blank">pgp.mit.edu</a>).<br>
<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</font></span></blockquote></div><br></div>