我在Haskell中有一个常量声明 - 我可以强制提前评估它吗?我看到一些看起来很像的代码,
myList = [(a, b), (c, d)]
...
map (f . fst) myList
在我对其进行分析时,fst
通话需要一些时间(它有168M来电)。 myList
的二进制表示非常小,例如,可以复制到全局内存[如果这是一个C程序]。我当然正在编译-O3 -optc-O3
。
非常感谢!
sclv的答案中给lift
调用的任何表达式都必须是Lift的实例。有一个名为th-lift
的库,它将为自定义数据类型生成Lift实例。查看该软件包的documentation。
答案 0 :(得分:13)
使用Template Haskell生成编译时常量:
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH.Syntax(Lift(..))
test = $(lift $ (map (*20) [0..100] :: [Int]))
lift
获取Haskell值并将其提升为TH Exp。 $()
运行附带的引用,并在编译时将生成的exp拼接到代码中。