如何将常量适用表格制作成一个不变的适用表格,以阻止它在程序的整个生命周期中保留?
我尝试过这种方法:
-- | Dummy parameter to avoid creating a CAF
twoTrues :: () -> [[[Bool]]]
twoTrues _ = map (++ (True : repeat False)) . trueBlock <$> [1..]
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用 - 配置文件显示它仍然保留,仍然将其标记为CAF.
我发现了一个相关的Google结果,Simon Peyton-Jones对Neil Mitchell 的回复,他正好问了这个问题 - 但不幸的是,答案指的是一个死链接.
我正在为Super Combinators所做的努力:
超级组合器是常量或组合器,其仅包含超级组合器作为子表达式.
还有Constant Applicative Forms是什么:
任何不是lambda抽象的超级组合子.这包括真正的常量表达式,如12,((+)1 2),[1,2,3]以及部分应用的函数,如((+)4).请注意,最后一个示例在eta抽象下等效于\ x - >(+)4 x,它不是CAF.
这对我没有任何意义!是不是((+) 4)
像12一样"真正不变"?CAF听起来像是我简单心灵的价值观.
如果我将Kolakoski序列定义为
kolakoski :: () -> [Int]
kolakoski () = 1 : 2 : helper ()
where
helper () = 2 : concat (zipWith replicate (helper ()) (cycle [1, 2]))
Run Code Online (Sandbox Code Playgroud)
找到500,000,000个词
kolakoski () !! 500000000
Run Code Online (Sandbox Code Playgroud)
我发现当使用ghc -O编译时,这会很快消耗大量内存.但是,如果关闭优化,它几乎不会使用任何东西.哪种优化导致了这种情况,如何将其关闭?