constहो सकता है कि सिर्फ वही कार्यान्वयन हो जो आप अन्य कार्यों के साथ संयोजन के लिए देख रहे हैं। यहाँ एक उदाहरण मैंने खोजा है।
मान लें कि हम 2-टुपल्स की संरचना को 2-टुपल्स की एक और संरचना में फिर से लिखना चाहते हैं। मैं इसे इस प्रकार व्यक्त कर सकता हूं:
((a,b),(c,d)) ⇒ (a,(c,(5,a)))
मैं पैटर्न मिलान के साथ सीधे-आगे की परिभाषा दे सकता हूं:
f ((a,b),(c,d)) = (a,(c,(5,a)))
क्या होगा अगर मैं इस तरह के पुनर्लेखन के लिए एक व्यर्थ (टैसिट) समाधान चाहता हूं? कुछ सोच और बाद में, जवाब है कि हम किसी भी पुनर्लेखन को व्यक्त कर सकते हैं (&&&), const, (.), fst, snd। ध्यान दें कि (&&&)से है Control.Arrow।
इन कार्यों का उपयोग कर उदाहरण का हल है:
(fst.fst &&& (fst.snd &&& (const 5 &&& fst.fst)))
के साथ समानता पर ध्यान दें (a,(c,(5,a)))। अगर हम &&&साथ बदल दें तो क्या होगा ,? तो यह पढ़ता है:
(fst.fst, (fst.snd, (const 5, fst.fst)))
ध्यान दें कि aपहला तत्व का पहला तत्व कैसा है, और यही fst.fstप्रोजेक्ट है। ध्यान दें कि cदूसरे तत्व का पहला तत्व कैसे है, और यही fst.sndप्रोजेक्ट है। यही है, चर अपने स्रोत के लिए मार्ग बन जाते हैं।
constहमें स्थिरांक लगाने की अनुमति देता है। दिलचस्प है कि नाम का अर्थ के साथ क्या मतलब है!
मैं तो अनुप्रयोगी के साथ इस विचार सामान्यीकृत, ताकि आप एक व्यर्थ शैली में किसी भी समारोह में लिख सकते हैं (जब तक कि आप मामले विश्लेषण जैसे काम करता है, के रूप में उपलब्ध है maybe, either, bool)। फिर, constस्थिरांक को शुरू करने की भूमिका निभाता है। आप इस काम को Data.Function.Tacit पैकेज में देख सकते हैं ।
जब आप लक्ष्य पर, और फिर एक कार्यान्वयन की दिशा में काम करना शुरू करते हैं, तो आप उत्तरों से आश्चर्यचकित हो सकते हैं। यह कहना है, किसी भी एक समारोह के रूप में रहस्यमय हो सकता है एक मशीन में किसी भी एक कोग। यदि आप पूरी मशीन को देखने के लिए वापस खींचते हैं, हालांकि, आप उस संदर्भ को समझ सकते हैं जिसमें यह आवश्यक है।
backgroundColor :: Text -> Colorमेरे लिए हैbackgroundColor = const White