Hi,<br>Since I actually didn&#39;t use the parameter in calculation, the return value only depends on the type<br>of input, not the actually value. If it&#39;s impossible to cache the result, is there another way to<br>memorize this &quot;function&quot; ?<br>

<br><div class="gmail_quote">On Sun, Nov 6, 2011 at 9:20 PM, Yucheng Zhang <span dir="ltr">&lt;<a href="mailto:yczhang89@gmail.com">yczhang89@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="HOEnZb"><div class="h5">On Sun, Nov 6, 2011 at 9:10 PM, Bin Jin &lt;<a href="mailto:bjin1990@gmail.com">bjin1990@gmail.com</a>&gt; wrote:<br>
&gt; Hi, everyone<br>
&gt;<br>
&gt; I&#39;m recently trying to implement the Montgomery reduction algorithm[1] in<br>
&gt; Haskell, the code can be found on<br>
&gt; my Github page[2]. After doing some benchmark testing I found that the<br>
&gt; library works rather slow. With the<br>
&gt; help of `trace` function from Debug.Trace, I found that GHC is not magical<br>
&gt; enough to memorize values with<br>
&gt; the same type(well, it&#39;s actually dynamically generated number parameterized<br>
&gt; type).<br>
&gt;<br>
&gt; I used binary representation to handle all positive numbers in type system.<br>
&gt;<br>
&gt;&gt; data One = One<br>
&gt;&gt; data D0 a = D0 a<br>
&gt;&gt; data D1 a = D1 a<br>
&gt;&gt; class PostiveN a where<br>
&gt;&gt;     p2num :: (Num b, Bits b) =&gt; a -&gt; b<br>
&gt;&gt; instance PostiveN One ...<br>
&gt;&gt; instance PostiveN a =&gt; PostiveN (D0 a) ...<br>
&gt;&gt; instance PostiveN a =&gt; PostiveN (D1 a) ...<br>
&gt;<br>
&gt; Here is a function that will be called everytime by `(*)` in `Num` typeclass<br>
&gt;&gt; montgKeys :: (PostiveN p, Integral a, Bits a) =&gt; p -&gt; a<br>
&gt;<br>
&gt; as you can imagine, I always pass (undefined :: p) as parameter to<br>
&gt; `montgKeys`, so if it&#39;s handled<br>
&gt; well, it should be memorized for future usage. But tracing shows that both<br>
&gt; `p2num` and `montgKeys`<br>
&gt; are evaluated every time being called.<br>
&gt;<br>
&gt; So my question is, how to force GHC memorizing this kind of functions?<br>
&gt;<br>
&gt; [1]: <a href="http://en.wikipedia.org/wiki/Montgomery_reduction" target="_blank">http://en.wikipedia.org/wiki/Montgomery_reduction</a><br>
&gt; [2]: <a href="https://github.com/bjin/montg-reduce" target="_blank">https://github.com/bjin/montg-reduce</a><br>
&gt;<br>
&gt; Regards,<br>
&gt; Bin<br>
<br>
</div></div>GHC only memorizes data structures, but not functions. See [1].<br>
<br>
[1] <a href="http://www.haskell.org/haskellwiki/Memoization" target="_blank">http://www.haskell.org/haskellwiki/Memoization</a><br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
Yucheng Zhang<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>
</font></span></blockquote></div><br>