爲了簡單起見,我將使用這個人爲的例子類(的一點是,我們從方法得出一些昂貴的數據):記憶化和類型類
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