[Haskell] How to make sure that a function is evaluated only once?

Dan Weston westondan at imageworks.com
Fri Dec 22 13:51:01 EST 2006

I thought a let expression was just as lazy as a where clause. Is this 
not true?


Lemmih wrote:
> 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.

More information about the Haskell mailing list