有没有办法强制 GHC 在特定值的生命周期内对特定计算进行重击?
我显然可以将值放入记录中,为所述计算的结果创建惰性记录条目,并创建一个生成器函数来构建记录并将值复制到所述条目中。
我讨厌每次我想要它时都需要从记录中提取原始值。而且 Haskell 没有像 C++ 或 Java 这样的临时多态 is-a 关系。
是否有任何技巧可以在具有相同参数的函数的多个不相关调用中记忆值?
我可以模糊地想象各种依赖类型形式的技巧,这些技巧可以有效地告诉编译器多种用法即将到来。Haskell 中没有任何依赖类型,但可能是隐式参数?我想不是,但我想我会问。也许是一个编译器?
想象一下,我有一个Necklace
数据结构向量,我需要一个有理数的结果向量,存储为一个公分母和一个分子向量。
{-# LANGUAGE ImplicitParams #-}
import qualified Data.Vector as V
data Necklace = Necklace { ... }
necklace_length n = ...
denominator :: (necklaces :: V.Vector Necklace) => Int
denominator = V.foldl' lcm 30 $ V.map necklace_length ?necklaces
numerators :: (necklaces :: V.Vector Necklace) => V.Vector Int
numerators = V.map f ?necklaces
where f x = ... denominator ...
kittytoy :: (necklaces :: V.Vector Necklace) => Meow -> ...
kittytoy = \meow -> ... numerators ...
先验地,我希望,如果我调用kittytoy
几百万次,每次都使用不同的参数meow
,那么 GHC 会生成调用numerators
一百万次的代码,每次都使用相同的隐式参数necklaces
。
尽管如此,很明显numerators
只需要调用一次,第一次?necklaces
被分配,这意味着 GHC 可能会注意到这种优化。
甚至应该有一种显式的代码重构方法,使用模板 haskell 通过生成类似代码?numerators = numerators
并添加numerators :: V.Vector Int
到调用它的函数的类型约束来显式传递 thunk。