आपको Data.MemoCombinators उपयोगी (डेटा-मेमोकॉम्बिनेटर पैकेज में) मिल सकता है।
आप कहते हैं कि क्या तर्क प्रकारों अपने f
और g
ले --- वे दोनों तो अभिन्न मान लेता है, यदि आप इसे इस तरह का प्रयोग करेंगे:
import qualified Data.MemoCombinators as Memo
foo = iterate step (Memo.integral f0, Memo.integral g0)
यदि आवश्यक हो, आप के उत्पादन में memoise सकता है प्रत्येक चरण के साथ-साथ
step (f,g) = (Memo.integral (newF f g), Memo.integral (newG f g))
मुझे आशा है कि आप इसे पूरे कार्यक्रम को अलग करने के रूप में नहीं देख पाएंगे।
अपनी टिप्पणी के जवाब में:
यह सबसे अच्छा मैं के साथ आ सकता है। यह अवांछित है, लेकिन सही लाइनों के साथ काम करना चाहिए।
मुझे चिंता है कि Double
और Rational
के बीच परिवर्तित बेकार में अक्षम है --- अगर वहाँ हम बजाय Memo.bits
इस्तेमाल कर सकते हैं Double
के लिए एक Bits
उदाहरण था। तो यह अंततः आपके लिए किसी भी व्यावहारिक उपयोग का नहीं हो सकता है।
import Control.Arrow ((&&&))
import Data.Ratio (numerator, denominator, (%))
memoV :: Memo.Memo a -> Memo.Memo (V a)
memoV m f = \(V x y z) -> table x y z
where g x y z = f (V x y z)
table = Memo.memo3 m m m g
memoRealFrac :: RealFrac a => Memo.Memo a
memoRealFrac f = Memo.wrap (fromRational . uncurry (%))
((numerator &&& denominator) . toRational)
Memo.integral
एक अलग दृष्टिकोण।
आप
step :: (V Double -> V Double, V Double -> V Double)
-> (V Double -> V Double, V Double -> V Double)
है कैसे के बारे में आप बदल कि
step :: (V Double -> (V Double, V Double))
-> (V Double -> (V Double, V Double))
step h x = (r fx gx, s fx gx)
where (fx, gx) = h x
और यह भी करने के लिए बदल
foo = (fst . bar, snd . bar)
where bar = iterate step (f0 &&& g0)
उम्मीद है कि
साझा fx
और gx
गति का एक सा में परिणाम चाहिए -अप।
बार-बार n'th 'f' को पुन: संकुचित करने से बार-बार (n-1) 'th' f' पुन: गणना नहीं होती है ... लेकिन याद रखें, फ़ंक्शन को पुन: कंप्यूटिंग करने का मतलब यह नहीं है कि कॉलिंग के परिणाम को पुनः संयोजित करना एक तर्क के साथ एक समारोह! –