[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?

Dan

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