How to make sure that a function is evaluated only once?
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. Any hints? Thanks, Axel -- Phone: +46 8 790 4124, Email: axel@kth.se, Web: www.it.kth.se/~axel -- --- Phone: +46 8 790 4124, Email: axel@imit.kth.se, Web: www.imit.kth.se/~axel
On 12/21/06, Axel Jantsch <axel@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
On 12/21/06, Axel Jantsch <axel@kth.se> wrote:
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.
Maybe you want to memoize it? Memoization is when you wrap a function so that its results are stored in a data structure indexed by argument. This can be done either purely or impurely. What kind of argument ranges are we talking about?
participants (3)
-
Axel Jantsch -
Lemmih -
Samuel Bronson