I kind a mention this because it might be easy for a polymorphic CAF to do memoization so its value gets computed maximum once per type, e.g (quick and dirty code follows)<div><br><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;"><span class="Apple-style-span" style="font-size: small;">import           Data.Typeable<br>
import           Data.IORef<br>import qualified Data.IntMap as M<br>import           System.IO.Unsafe<br>import           Debug.Trace<br><br>fooCache :: IORef (M.IntMap a)<br>fooCache = unsafePerformIO $ newIORef M.empty<br>
<br>foo :: (Typeable a, Num a) =&gt; a<br>foo = unsafePerformIO $ do<br>        key &lt;- typeRepKey (typeOf value)<br>        atomicModifyIORef fooCache (updateCache key)<br>  where<br>    value = trace &quot;foo is computed&quot; $ 42<br>
    updateCache key cache =<br>      case key `M.lookup` cache of<br>        Just n -&gt; (cache, trace &quot;foo was cached&quot; n)<br>        Nothing -&gt; (M.insert key value cache, value)</span></span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;"><br>
</span></div><div><span class="Apple-style-span" style="font-size: 12px; "><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;">A compiler (and Haskellers more clever than myself) could certainly come up with something much more efficient here.</span></span></div>
<div><br>On Sat, Mar 28, 2009 at 12:51 AM, Peter Verswyvelen &lt;<a href="mailto:bugfact@gmail.com">bugfact@gmail.com</a>&gt; wrote:<br>&gt;<br>&gt; From a previous email in the beginners list I more or less understood that the monomorphism restriction will not exist anymore in Haskell Prime.<br>
&gt; Is this correct?<br>&gt; On Fri, Mar 27, 2009 at 10:32 PM, Jonathan Cast &lt;<a href="mailto:jonathanccast@fastmail.fm">jonathanccast@fastmail.fm</a>&gt; wrote:<br>&gt;&gt;<br>&gt;&gt; On Fri, 2009-03-27 at 14:26 -0700, Kirk Martinez wrote:<br>
&gt;&gt; &gt; Your powersOfTwo function, since it gets memoized automatically (is<br>&gt;&gt; &gt; this the case for all functions of zero arguments?),<br>&gt;&gt;<br>&gt;&gt; It is the case for all functions which have zero arguments *at the time<br>
&gt;&gt; they are presented to the code generator*.  The infamous evil<br>&gt;&gt; monomorphism restriction arises from the fact that overloaded<br>&gt;&gt; expressions, such as<br>&gt;&gt;<br>&gt;&gt;    negative_one = exp(pi * sqrt(-1))<br>
&gt;&gt;<br>&gt;&gt; look like functions of zero arguments, but are not, and hence do not get<br>&gt;&gt; memoized.  This behavior was considered sufficiently surprising, when it<br>&gt;&gt; was discovered in early Haskell compilers, that the construct was<br>
&gt;&gt; outlawed from the language entirely.<br>&gt;&gt;<br>&gt;&gt; jcc<br>&gt;&gt;<br>&gt;&gt;<br>&gt;&gt; _______________________________________________<br>&gt;&gt; Haskell-Cafe mailing list<br>&gt;&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt;&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>&gt;<br><br></div>