为了简单起见,我将使用这个人为的例子类(的一点是,我们从方法得出一些昂贵的数据):记忆化和类型类
class HasNumber a where
getNumber :: a -> Integer
getFactors :: a -> [Integer]
getFactors a = factor . getNumber
当然,我们可以做memoizing实现这个类如:
data Foo = Foo {
fooName :: String,
fooNumber :: Integer,
fooFactors :: [Integer]
}
foo :: String -> Integer -> Foo
foo a n = Foo a n (factor n)
instance HasNumber Foo where
getNumber = fooNumber
getFactors = fooFactors
但它似乎是需要有点难看的“因素”字段手动添加到,这将是一个HasNumber
实例的任何记录。下一步的想法:
data WithFactorMemo a = WithFactorMemo {
unWfm :: a,
wfmFactors :: [Integer]
}
withFactorMemo :: HasNumber a => a -> WithFactorMemo a
withFactorMemo a = WithFactorMemo a (getFactors a)
instance HasNumber a => HasNumber (WithFactorMemo a) where
getNumber = getNumber . unWfm
getFactors = wfmFactors
这将需要大量的样板的原始a
的所有其他业务提升为WithFactorMemo a
,虽然。
是否有任何优雅的解决方案?
我只是想到了另外一个解决办法是让*因素*功能memoizing,虽然这将是不太实际的,如果getNumber'的'结果是一些比较大的数据结构,(据我所知)的条目将永远不会被垃圾收集(与我的问题中的两个解决方案相反)。 – FunctorSalad