强制预先计算常数

时间:2011-05-25 09:32:44

标签: performance haskell lazy-evaluation compile-time template-haskell

我在Haskell中有一个常量声明 - 我可以强制提前评估它吗?我看到一些看起来很像的代码,

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

在我对其进行分析时,fst通话需要一些时间(它有168M来电)。 myList的二进制表示非常小,例如,可以复制到全局内存[如果这是一个C程序]。我当然正在编译-O3 -optc-O3

非常感谢!

为自定义类型生成Lift实例

sclv的答案中给lift调用的任何表达式都必须是Lift的实例。有一个名为th-lift的库,它将为自定义数据类型生成Lift实例。查看该软件包的documentation

1 个答案:

答案 0 :(得分:13)

使用Template Haskell生成编译时常量:

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

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

lift获取Haskell值并将其提升为TH Exp。 $()运行附带的引用,并在编译时将生成的exp拼接到代码中。