First of all, the current standard for arrays is the
vector 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
(unsafe)freeze/thaw 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.
Then you end up with:
import qualified Data.Vector.Unboxed as VU
data Surface = Surface { vertices :: VU.Vector Vertex, faces :: VU.Vector Face }
render :: Surface -> IO ()
etc.