की एक खेल खेलते हैं। दो ढेर हैं जिनका उपयोग हम करने जा रहे हैं, दोनों काले/सफेद पक्षीय चिप्स शामिल हैं। ढेर बी में लेकिन यह कैसे -अपडेट कर रहा है कई उप क्षेत्रों
data Pile = Pile { _blacks, _whites :: Int }
makeLenses ''Pile
data Game = Game { _pileA, _pileB :: Pile }
makeLenses ''Game
वास्तव में एक चतुर चाल ढेर एक में एक काले रंग की चिप, और एक सफेद चिप से अधिक चालू करने के लिए हो सकता है?
cleverMove :: Game -> Game
cleverMove game = game & pileA . blacks -~ 1
& pileA . whites +~ 1
& pileB . blacks +~ 1
& pileB . whites -~ 1
बहुत सुंदर नहीं है। मैं प्रत्येक ढेर को दो बार संदर्भित किए बिना कैसे कर सकता हूं?
केवल एक चीज मैं के साथ आया था (और मुझे यह पसंद नहीं है):
cleverMove game = game & pileA %~ (blacks -~ 1)
. (whites +~ 1)
& pileB %~ (blacks +~ 1)
. (whites -~ 1)
(माफ करना पहले से यह स्पष्ट है कि अगर - मैं थोड़े लेंस के लिए नया हूँ और मैं समुद्र में खो लग रहा है combinators और ऑपरेटरों lens
पेशकश की। शायद वहाँ छिपा हर किसी की जरूरत के लिए सब कुछ है। ऐसा नहीं है कि यह, बुरा निश्चित रूप से है! लेकिन मैं चाहता हूँ वहाँ भी था एक पूरा मैनुअल शामिल थे।)
आपको विकल्प 2 के बारे में क्या पसंद नहीं है? इससे उससे ज्यादा संक्षिप्त नहीं हो सकता है, है ना? – leftaroundabout
@ बाएंराउंडबाउट मुझे यह पसंद नहीं है कि मुझे ब्रैकेट्स का उपयोग करना पड़ेगा, जो बहुमुखी अभिव्यक्तियों में शामिल होते हैं - जैसे कि 'डू' ब्लॉक और घोंसले के आगे के स्तर। – Artyom
मुझे लगता है कि यह आपकी मदद करेगा यदि आपने कुछ आदर्श छद्म कोड दिखाया है जो आपके आदर्श वाक्यविन्यास जैसा दिखता है। –