Предварительное вычисление постоянной силы - PullRequest
13 голосов
/ 25 мая 2011

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

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

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

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

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

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

1 Ответ

13 голосов
/ 25 мая 2011

Генерация константы времени компиляции с использованием Template Haskell:

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

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

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

...