Hi, everyone<br><br>I&#39;m recently trying to implement the Montgomery reduction algorithm[1] in Haskell, the code can be found on <br>my Github page[2]. After doing some benchmark testing I found that the library works rather slow. With the <br>

help of `trace` function from Debug.Trace, I found that GHC is not magical enough to memorize values with<br>the same type(well, it&#39;s actually dynamically generated number parameterized type).<br><br>I used binary representation to handle all positive numbers in type system. <br>

<br>&gt; data One = One<br>&gt; data D0 a = D0 a<br>&gt; data D1 a = D1 a<br>&gt; class PostiveN a where<br>&gt;     p2num :: (Num b, Bits b) =&gt; a -&gt; b<br>&gt; instance PostiveN One ...<br>&gt; instance PostiveN a =&gt; PostiveN (D0 a) ...<br>

&gt; instance PostiveN a =&gt; PostiveN (D1 a) ...<br><br>Here is a function that will be called everytime by `(*)` in `Num` typeclass<br>&gt; montgKeys :: (PostiveN p, Integral a, Bits a) =&gt; p -&gt; a<br><br>as you can imagine, I always pass (undefined :: p) as parameter to `montgKeys`, so if it&#39;s handled<br>

well, it should be memorized for future usage. But tracing shows that both `p2num` and `montgKeys`<br>are evaluated every time being called. <br><br>So my question is, how to force GHC memorizing this kind of functions?<br>

<br>[1]: <a href="http://en.wikipedia.org/wiki/Montgomery_reduction">http://en.wikipedia.org/wiki/Montgomery_reduction</a><br>[2]: <a href="https://github.com/bjin/montg-reduce">https://github.com/bjin/montg-reduce</a><br>

<br>Regards,<br>Bin<br>