Повторное вычисление чистого выражения в действии ввода-вывода

У меня есть процедура, которая (а) выполняет некоторый ввод-вывод, (б) создает таблицу поиска и (в) возвращает действие ввода-вывода который использует таблицу поиска. Но при компиляции с помощью -O , GHC (версия 6.12.1) встраивает конструкцию в таблицу поиска, так что она повторно вычисляется для каждого вызова действия ввода-вывода.

Пример:

module Main where
import Data.Array
import Data.IORef
import Control.Monad

makeAction getX getY sumRef = do
    x <- getX
    let a = listArray (0, 1000) [x ..]
    return $ do
        y <- getY
        modifyIORef sumRef (\sum -> sum + a ! y)

main = do
    sumRef <- newIORef 0
    action <- makeAction getX getY sumRef
    replicateM_ 100000 action
    n <- readIORef sumRef
    putStrLn (show n)
    where
    getX = return (1 :: Int)
    getY = return 0

Это проблема достаточно известна, чтобы иметь стандартный обходной путь с защитой от ошибок GHC - или как бы вы отрегулировали программу так, чтобы a не распределялся повторно?

5
задан antonakos 6 February 2011 в 11:35
поделиться