सम्भावित समाधान:
let iterateN n f x = take n (iterate f x)
यहाँ पुनरावृति (
from here) के एक एफ # संस्करण है, Seq.take एफ # मानक पुस्तकालय का हिस्सा है
> import Data.Monoid
> import Debug.SimpleReflect -- not really needed, just for showing the result
> (appEndo . mconcat . replicate 5 . Endo $ f) a
f (f (f (f (f a))))
एक और (पहले ही उल्लेख किया):
> iterate f a !! 5
f (f (f (f (f a))))
(lambdas जोड़ने आप इसे एक समारोह में बदल करना चाहते हैं)
हालांकि, मत भूलना कि हास्केल आलसी है: उपरोक्त विधियों पहले f
कई बार लगाने से एक thunk का निर्माण करेगा और उसके बाद ही मूल्यांकन कर शुरू करते हैं। कभी-कभी f
निरंतर स्थान में पुनरावृत्त किया जा सकता है, उदा। जब f :: Int -> Int
(और f
स्वयं स्थिर स्थान में काम करता है), लेकिन उपर्युक्त दृष्टिकोण केवल रैखिक स्थान में काम करते हैं।
मैं खुद सख्त यात्रा Combinator द्वारा परिभाषित करेगा, उदा .:
iter :: Int -> (a -> a) -> a -> a
iter 0 _ x = x
iter n f x = iter (pred n) f $! f x
या यहाँ तक कि,
iter n f x = foldl' (flip $ const f) x [1..n]
जो कम क्या पहले से ही विचाराधीन पोस्ट किया गया की हास्केल अनुवाद की अधिक है।
वैकल्पिक रूप से, हम iterate
की एक सख्त संस्करण (जो IMHO पहले से मौजूद हो ...)
iterate' :: (a -> a) -> a -> [a]
iterate' f x = x : (iterate' f $! f x)
downvoters में से एक की व्याख्या क्या समस्या यहाँ है कृपया कर सकते हैं? सवाल मेरे लिए अच्छा लगता है। यहां एफपी उप-समुदाय आमतौर पर वास्तव में अनुकूल होते हैं और मुझे उम्मीद है कि हम इसे इस तरह से रख सकते हैं, इसलिए कम से कम प्रश्न आपकी राय में क्यों बुरा है। – Carsten
मुझे लगता है कि आपको प्रति भाषा एक प्रश्न पोस्ट करना चाहिए, क्योंकि भविष्य के लोग शायद एक जवाब खोज लेंगे। मुख्य रूप से, मैं कहूंगा कि आपका प्रश्न अलग-अलग उत्तरों की अपेक्षा करता है, तो आपको इसे विभाजित करना चाहिए। – PatJ
@ करस्टन मॉडरेशन शोर के स्तर इस समय सामान्य से अधिक प्रतीत होते हैं। पिछले कुछ दिनों में मैंने न केवल अजीब डाउनवॉट्स बल्कि कम से कम दो [हैकेल] प्रश्नों में बेतुका करीबी मतों को देखा है। – duplode