Подтвердить что ты не робот

Предварительное вычисление силы постоянной

У меня есть постоянное объявление в Haskell - могу ли я заставить это оценивать раньше времени? Я вижу некоторый код, который выглядит примерно так:

myList = [(a, b), (c, d)]
...
map (f . fst) myList

требуется время в вызове fst при его профилировании (у него есть 168M-вызовы). Бинарное представление myList довольно мало и может быть, например, скопировано в глобальную память [если это была программа C]. Я компилирую с -O3 -optc-O3, конечно.

Большое спасибо!

Создание экземпляров Lift для пользовательского типа

Любое выражение, указанное в вызове lift в ответе sclv, должно быть экземпляром Lift. Там есть библиотека с именем th-lift, которая будет генерировать экземпляры Lift для пользовательских типов данных. См. Этот пакет документация.

4b9b3361

Ответ 1

Создание постоянной времени компиляции с использованием шаблона Haskell:

{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH.Syntax(Lift(..))

test = $(lift $ (map (*20) [0..100] :: [Int]))

lift принимает значение Haskell и поднимает его на TH Exp. $() запускает прилагаемую цитату и связывает сгенерированный exp в коде во время компиляции.