Предварительное вычисление силы постоянной
У меня есть постоянное объявление в Haskell - могу ли я заставить это оценивать раньше времени? Я вижу некоторый код, который выглядит примерно так:
myList = [(a, b), (c, d)]
...
map (f . fst) myList
требуется время в вызове fst
при его профилировании (у него есть 168M-вызовы). Бинарное представление myList
довольно мало и может быть, например, скопировано в глобальную память [если это была программа C]. Я компилирую с -O3 -optc-O3
, конечно.
Большое спасибо!
Создание экземпляров Lift для пользовательского типа
Любое выражение, указанное в вызове lift
в ответе sclv, должно быть экземпляром Lift. Там есть библиотека с именем th-lift
, которая будет генерировать экземпляры Lift для пользовательских типов данных. См. Этот пакет документация.
Ответы
Ответ 1
Создание постоянной времени компиляции с использованием шаблона Haskell:
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH.Syntax(Lift(..))
test = $(lift $ (map (*20) [0..100] :: [Int]))
lift
принимает значение Haskell и поднимает его на TH Exp. $()
запускает прилагаемую цитату и связывает сгенерированный exp в коде во время компиляции.