<p>Could template-Haskell be used somehow?</p>
<p> - Lyndon Maydwell</p>
<div class="gmail_quote">On Mar 10, 2012 4:50 AM, &quot;Clark Gaebel&quot; &lt;<a href="mailto:cgaebel@csclub.uwaterloo.ca">cgaebel@csclub.uwaterloo.ca</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
In Haskell, what&#39;s the canonical way of declaring a top-level array<br>
(Data.Vector of a huge list of doubles, in my case)? Performance is<br>
key in my case.<br>
<br>
The straightforward way would just be something like:<br>
<br>
globalArray :: V.Vector Double<br>
globalArray = V.fromList [ huge list of doubles ]<br>
{-# NOINLINE globalArray #-}<br>
<br>
However, I don&#39;t want to have to run the fromList at runtime. Not only<br>
would this mean a bigger executable (having to store a linked list,<br>
instead of an array), it would be quite inefficient since we don&#39;t<br>
even use the source list!<br>
<br>
Therefore, I was thinking of storing the array in a C file:<br>
<br>
static const double globalArray[] = { huge list of doubles };<br>
double* getGlobalArray() { return globalArray; }<br>
int        getGlobalArraySize() { return<br>
sizeof(globalArray)/sizeof(globalArray[0]); }<br>
<br>
And importing it in haskell witht he FFI, followed with an unsafeCast:<br>
<br>
foreign import ccall unsafe &quot;getGlobalArray&quot; c_globalArray :: Ptr CDouble<br>
foreign import ccall unsafe &quot;getGlobalArraySize&quot; c_globalArraySize :: CInt<br>
<br>
globalArray :: V.Vector Double<br>
globalArray = V.unsafeCast $ unsafeFromForeignPtr0 (unsafePerformIO $<br>
newForeignPtr_ c_globalArray) (fromIntegral c_globalArraySize)<br>
{-# NOINLINE globalArray #-}<br>
<br>
But this version (clearly) is full of &quot;unsafe&quot;ty. Is there a better<br>
way that I haven&#39;t thought of?<br>
<br>
Regards,<br>
  - clark<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>