У меня есть процедура, которая (а) выполняет ввод-вывод, (б) создает таблицу поиска и (в) возвращает действие ввода-вывода, использующее таблицу поиска. Но при компиляции с -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
не выделялось повторно?
{-# NOINLINE #-}
? - person fuz   schedule 06.02.2011{-# NOINLINE a #-}
на локальномa
этого не происходит. - person antonakos   schedule 06.02.2011a
. - person antonakos   schedule 06.02.2011