<div>I&nbsp;apologize if this has already been posted.&nbsp; I sent the following message several hours ago and I haven&#39;t seen it post.&nbsp; So, I&#39;m resending.</div>
<div>&nbsp;</div>
<div>I&#39;m trying to create a type called SmartArray.&nbsp; It is a type synonym for an array.&nbsp; If the element type can be unboxed, then SmartArray is an unboxed array.&nbsp; Otherwise, it is a boxed array.</div>
<p>For instance, </p>
<p>(SmartArray Int Double) is the same as (UArray Int Double)<br>(SmartArray Int String) is the same as (Array Int String)</p>
<p>However, my implementation of SmartArray requires me to create an instance of a selector class to tell the compiler whether the type is boxed or unboxed.&nbsp; I&#39;m hoping to avoid creating instances of the selector class for every possible type.&nbsp; I&#39;d be grateful for any suggestions.</p>

<p>Please see my code:</p>
<p>{-# OPTIONS_GHC <br>&nbsp;&nbsp;&nbsp; -fglasgow-exts <br>&nbsp;&nbsp;&nbsp; -fbreak-on-exception&nbsp; <br>&nbsp;&nbsp;&nbsp; -XOverlappingInstances<br>#-}</p>
<p>import Data.Ix<br>import Data.Array.Unboxed<br>import Data.Complex</p>
<p>type SmartArray i e = (Ix i, SmartArraySelector a e) =&gt; (a i e)</p>
<p>-- smartArray is similar to array function from Data.Array. But, it<br>-- will return a UArray if e can be unboxed.&nbsp; Otherwise, it returns an Array.</p>
<p>smartArray :: (i, i) -&gt; [(i, e)] -&gt; SmartArray i e<br>smartArray bnd eLst = array bnd eLst&nbsp; </p>
<p><br>class (IArray a e) =&gt; SmartArraySelector a e | e -&gt; a where<br>&nbsp;&nbsp;&nbsp; arrayType :: Ix i =&gt; a i e -&gt; a i e<br>&nbsp;&nbsp;&nbsp; arrayType = id</p>
<p>-- SmartArraySelector selects UArray for all types that can be<br>-- unboxed.&nbsp; An instance has to be created for each unboxed type.&nbsp; I&#39;d<br>-- like to avoid listing all unboxed types here.&nbsp; However, since there<br>
-- are only a few unboxed types, it&#39;s not too burdensome to list them<br>-- all.&nbsp; (For brevity, I didn&#39;t create all possible instances.)</p>
<p>instance SmartArraySelector UArray Bool&nbsp;&nbsp; where<br>instance SmartArraySelector UArray Char&nbsp;&nbsp; where<br>instance SmartArraySelector UArray Double where<br>instance SmartArraySelector UArray Float&nbsp; where<br>instance SmartArraySelector UArray Int&nbsp;&nbsp;&nbsp; where</p>

<p><br>-- SmartArraySelector selects Array for all types that can&#39;t be<br>-- unboxed.&nbsp; An instance has to be created for EVERY possible unboxed<br>-- type that might be used with SmartArray.&nbsp; Since, the list of<br>-- possible types is unlimited, this is pretty annoying.</p>

<p>instance SmartArraySelector Array String where<br>instance SmartArraySelector Array (Complex e) where</p>
<p><br>-- I&#39;d like to replace all the boxed instances above with one instance<br>-- like . . .<br>--<br>-- instance SmartArraySelector Array e where<br>--<br>-- However, this generates an error even though,<br>-- -XOverlappingInstances turned on.</p>
<br>