Я пытаюсь измерить производительность простой программы Haar DWT, используя структуру Criterion. (Это ошибочно медленно, но я оставлю это для другого вопроса). К сожалению, я не могу найти хорошую документацию в Интернете. Мои две основные проблемы:
- Как передать данные с одного теста на другой? Я хочу, чтобы каждый этап программы.
 - Как работает выборка и избегайте ленивой оценки, повторно использующей предыдущие вычисления?
 
Этот источник относительно ограничен; первая функция getRandList создает список случайных чисел; haarStep преобразует входной сигнал в разности и суммы, а haarDWT вызывает первый и рекурсивные суммы. Я пытаюсь передать getRandList на haarDWT через ленивую оценку, но, возможно, мое использование неверно/не поддерживается. Тайминги, похоже, не имеют смысла.
{-# LANGUAGE ViewPatterns #-}
import Control.Arrow
import qualified Data.Vector.Unboxed as V
import System.Random
import Criterion.Main
invSqrt2 = 0.70710678118654752440
getRandList :: RandomGen g => g -> Int -> [Float]
getRandList gen 0 = []
getRandList gen n = v:rest where
    (v, gen') = random gen
    rest = getRandList gen' (n - 1)
haarStep :: V.Vector Float -> (V.Vector Float, V.Vector Float)
haarStep = (alternatingOp (-) &&& alternatingOp (+)) where
    alternatingOp op x = V.generate (V.length x `div` 2) (\i ->
        ((x V.! (2 * i)) `op` (x V.! (2 * i + 1))) * invSqrt2)
haarDWT :: V.Vector Float -> V.Vector Float
haarDWT [email protected](V.length -> 1) = xl
haarDWT (haarStep -> (d, s)) = haarDWT s V.++ d
main = do
    gen <- getStdGen
    inData <- return $ getRandList gen 2097152
    outData <- return $ haarDWT (V.fromList inData)
    defaultMain [
        bench "get input" $ nf id inData,
        bench "transform" $ nf V.toList outData
        ]
    writeFile "input.dat" (unlines $ map show inData)
    writeFile "output.dat" (unlines $ map show $ V.toList outData)
Наконец, я получаю сообщение об ошибке при попытке называть его -s 1; возможно, это всего лишь ошибка Criterion.
Main: ./Data/Vector/Generic.hs:237 ((!)): index out of bounds (1,1)
Спасибо заранее!