[Haskell] How to make sure that a function is evaluated only once?
Lemmih
lemmih at gmail.com
Fri Dec 22 05:44:24 EST 2006
On 12/22/06, Axel Jantsch <axel at kth.se> wrote:
>
> Thanks to all who replied. I still haven't figured out a solution. I
> thought about memoizing the result, as several of you have suggested,
> but I am scared by the huge argument space.
>
> Lemmih <lemmih at gmail.com> wrote:
>
> > Do you have a minimal test case showing the undesirable behaviour?
>
>
> gf (actCnt,sndCnt, sizex, sizey, locx, locy) iPack
> = (newSndCnt sndCnt outPack, outPack)
> where
> outPack = fWrapper sizex sizey locx locy actCnt iPack
> newSndCnt n (Abst,_) = n
> newSndCnt n (Prst _,_) = n + 1
>
> This is a simplified context for the call to the C function, which is
> wrapped by fWrapper.
> I figured out that one reason for double evaluation is that outPack is
> used twice in the return expression of gf.
>
> So my question now is, can I force the evaluation machine to evaluate
> fWrapper once and use the same result value in both places where outPack
> is used?
>
> I tried the NOINLINE pragma both on outPack and on fWrapper, but to no
> avail.
>
> Again, I am grateful for any hint to a work-around.
Try using a let-expression and/or make the tuple arguments strict.
--
Cheers,
Lemmih
More information about the Haskell
mailing list