[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