【发布时间】:2014-09-23 08:00:03
【问题描述】:
像5 :: Num a => a 这样的多态“常量”并不是真正的常量,而是字典参数的函数。因此,如果你定义
primes :: Num n => [n]
primes = ...
当然是不好的例子,这里没有充分的理由让它多态......我真正感兴趣的是,如果你尝试全局记忆一个非平凡的多态函数,例如memo-tries.
那么这个序列将不会在来自不同站点的调用之间共享,这在性能方面并不好。 (这难道不是 Haskell 标准赋予我们可怕的单态性限制的主要原因吗?)
我能看到如何强制共享的唯一方法是为约束类的每个实例设置一个单态“标签”。例如
erastothenes :: Num n => [n]
erastothenes = ...
class (Num n) => HasPrimes n where
-- | @'primes' ≡ 'erastothenes'@
primes :: [n]
integerPrimes :: [Integer]
integerPrimes = erastothenes
instance HasPrimes Integer where
primes = integerPrimes
...这在优雅方面并不好。
有没有更好的方法来实现这样的记忆?
【问题讨论】:
-
也许
SPECIALIZE编译指示有用吗?不过,您仍然需要明确列出您想要专门针对的类型。 -
@bennofs:如果
SPECIALIZE可以为此目的可靠地工作,那么这对我来说实际上似乎是最优雅的方式。如果你做一个示例实现,我会接受这个答案。
标签: haskell memoization parametric-polymorphism