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

Lemmih lemmih at gmail.com
Thu Dec 21 05:43:04 EST 2006


On 12/21/06, Axel Jantsch <axel at kth.se> wrote:
>
> Hello,
>
> I have a function with type
>
> f :: Int -> Int -> Int -> Int -> Int -> NRup -> NRdown
>
> and I want to make sure it is evaluated only once for the same set of
> arguments but I observe that it is always evaluated several times.
>
> f is implemented in C and called via the FFI. The C function may or may
> not be pure. In principle it is but it is convenient to keep some state
> for debugging and monitoring.
> Anyway, even if it is pure, I want it to evaluate only once for a set of
> arguments because of performance.
>
> How can I enforce this?
> Is there a GHC option for that?
> Is there a way to write the Haskell code to achieve this?
>
>
> I have asked the same question in the context of FFI, but now it seems to
> me this question is not directly related to the FFI.

Haskell implementations are free to evaluate expressions as many times
as they feel like. If you want to be absolutely sure, use the IO
monad. On the other hand, you might get the same effect with a few
cleverly placed {-# NOINLINE #-} pragmas.
Do you have a minimal test case showing the undesirable behaviour?

-- 
Cheers,
  Lemmih


More information about the Haskell mailing list