我无法弄清楚为什么m1显然被记忆,而m2不在下面:
m1 = ((filter odd [1..]) !!)
m2 n = ((filter odd [1..]) !! n)
Run Code Online (Sandbox Code Playgroud)
m1 10000000在第一次调用时大约需要1.5秒,而后续调用需要一小部分(大概是缓存列表),而m2 10000000总是花费相同的时间(每次调用重建列表).知道发生了什么事吗?关于GHC是否以及何时会记忆功能,是否有任何经验法则?谢谢.
多态"常量",5 :: Num a => a不是真正的常量,而是字典参数的功能.因此,如果你定义
primes :: Num n => [n]
primes = ...
Run Code Online (Sandbox Code Playgroud)
当然不好的例子,这里没有充分的理由让它具有多态性...我真正感兴趣的是如果你尝试全局记忆一个非平凡的多态函数,例如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
Run Code Online (Sandbox Code Playgroud)
......在优雅方面不是很好.
有没有更好的方法来实现这样的备忘录?