शुरुआत करने के लिए, हमारे पास सुंदर परिभाषा है
x = 1 : map (2*) x
यदि आप पहले कभी इसे नहीं देखा है, जो अपने आप से थोड़ा सा झुकने वाला है। वैसे भी यह आलस्य और पुनरावृत्ति की काफी मानक चाल है। अब, हम स्पष्ट पुनरावर्तन का उपयोग करके fix, और बिंदु मुक्त-ify से छुटकारा पा लेंगे ।
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
अगली चीज जो हम करने जा रहे हैं वह है :अनुभाग का विस्तार करना और mapअनावश्यक रूप से जटिल बनाना ।
x = fix ((:) 1 . (map . (*) . (*2)) 1)
खैर, अब हमारे पास उस स्थिरांक की दो प्रतियां हैं 1। ऐसा कभी नहीं होगा, इसलिए हम पाठक के आवेदन का उपयोग डी-डुप्लिकेट करने के लिए करेंगे। इसके अलावा, फंक्शन कंपोजिशन थोड़ा बकवास है, इसलिए (<$>)हम जहां चाहें वहां इसे बदल सकते हैं।
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
अगला: वह कॉल mapबहुत पठनीय है। लेकिन डरने की कोई बात नहीं है: हम इसे थोड़ा विस्तार देने के लिए मोनाद कानूनों का उपयोग कर सकते हैं। विशेष रूप से fmap f x = x >>= return . f, इसलिए
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
हम बिंदु-मुक्त-ify, के (.)साथ प्रतिस्थापित कर सकते हैं (<$>), और फिर कुछ सहज खंड जोड़ सकते हैं:
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
इस समीकरण को हमारे पिछले चरण में प्रतिस्थापित करना:
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
अंत में, आप अपने स्पेसबार को तोड़ते हैं और अद्भुत अंतिम समीकरण उत्पन्न करते हैं
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)