13

我在 Haskell 中有一个常量声明——我可以强制它提前进行评估吗?我看到一些看起来大致像这样的代码,

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

在我分析它时花点时间fst(它确实有 1.68 亿次通话)。的二进制表示myList非常小,例如,可以复制到全局内存中[如果这是一个 C 程序]。我-O3 -optc-O3当然在编译。

非常感谢!

为自定义类型生成 Lift 实例

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

4

1 回答 1

13

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

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

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

lift取一个 Haskell 值并将其提升为 TH Exp。运行封闭的$()报价,并在编译时将生成的 exp 拼接到代码中。

于 2011-05-25T18:47:31.840 回答