हमें Control.Lens.Reified क्यों चाहिए? क्या कोई कारण है कि मैं Lens
सीधे कंटेनर में नहीं रख सकता हूं? reify
का मतलब क्या है?हमें Control.Lens.Reified क्यों चाहिए?
उत्तर
हमें संशोधित लेंस की आवश्यकता है क्योंकि हास्केल की प्रकार प्रणाली अनुमानित है। मुझे लगता है कि वास्तव में क्या मतलब है की तकनीकी जानकारी नहीं पता है, लेकिन यह
[Lens s t a b]
कुछ प्रयोजनों के लिए की तरह प्रकार प्रतिबन्धित है, इसे बजाय
Functor f => [(a -> f b) -> s -> f t]
का उपयोग स्वीकार्य है, लेकिन आप उस में पहुँचने पर आपको Lens
नहीं मिलता है; आपको LensLike
कुछ मज़ेदार या किसी अन्य के लिए विशिष्ट मिलता है। ReifiedBlah
नए प्रकार आपको पूर्ण बहुरूपता पर लटका देते हैं।
परिचालन [ReifiedLens s t a b]
जिनमें से प्रत्येक एक Functor f
शब्दकोश लेता है, जबकि forall f . Functor f => [LensLike f s t a b]
एक समारोह है कि एक Functor f
शब्दकोश लेता है और एक सूची लौटाती है कार्यों की एक सूची है।
"पुनरुत्थान" का अर्थ क्या है, ठीक है, शब्दकोश कुछ कहेंगे, और ऐसा लगता है कि हास्केल में विशिष्ट अर्थों की एक अपेक्षाकृत विविधता में अनुवाद करना प्रतीत होता है। तो उस पर कोई टिप्पणी नहीं है।
समस्या यह है कि, हास्केल में, टाइप एब्स्ट्रक्शन और एप्लिकेशन पूरी तरह निहित हैं; कंपाइलर को जहां आवश्यक हो वहां डालना चाहिए। 'अपमानजनक' एक्सटेंशन को डिजाइन करने के कई प्रयास, जहां संकलक चालाक अनुमान लगाएगा कि उन्हें कहां रखा जाए, असफल रहे;
- प्रकार कपोल-कल्पना केवल एक समारोह परिभाषा के शीर्ष स्तर पर होते हैं: तो सबसे सुरक्षित बात हास्केल 98 नियमों पर निर्भर किया जा रहा समाप्त होता है।
- जब भी एक पॉलिमॉर्फिक प्रकार के साथ एक चर अभिव्यक्ति में उपयोग किया जाता है तब अनुप्रयोगों को तत्काल तब होता है।
तो अगर मैं एक साधारण लेंस को परिभाषित: [1]
lensHead f [] = pure []
lensHead f (x:xn) = (:xn) <$> f x
और एक अभिव्यक्ति में उपयोग:
[lensHead]
lensHead
स्वचालित रूप से प्रकार पैरामीटर के कुछ सेट करने के लिए लागू हो जाता है ; जिस बिंदु पर यह अब लेंस नहीं है, क्योंकि यह अब मज़ेदार में बहुलक नहीं है। दूर लेना है: एक अभिव्यक्ति हमेशा में कुछ मोनोमोर्फिक प्रकार है; तो यह एक लेंस नहीं है। (आप ध्यान दें हूँ कि lens
कार्यों प्रकार Getter
और Setter
के तर्कों, जो monomorphic प्रकार, यह करने के लिए इसी तरह के कारणों के लिए कर रहे हैं ले लो। लेकिन एक [Getter s a]
लेंस की एक सूची है, क्योंकि वे केवल ही टिककर खेल के लिए विशेष किया गया है नहीं है ।)
reify
का क्या अर्थ है? शब्दकोश परिभाषा 'असली बनाओ' है। वास्तविकता (आदर्श या अमूर्त के बजाए) के बारे में कुछ संबंधित या इलाज के कार्य को संदर्भित करने के लिए दर्शन में 'सुधार' का उपयोग किया जाता है। प्रोग्रामिंग में, यह उस चीज़ को लेने के लिए संदर्भित करता है जिसे आम तौर पर डेटा संरचना के रूप में नहीं माना जा सकता है और इसे एक के रूप में दर्शाया जा सकता है।उदाहरण के लिए, वास्तव में पुराने लिस्पस में, प्रथम श्रेणी के कार्यों के लिए उपयोग नहीं किया गया था; बजाय, आप eval
उन्हें एस भाव का उपयोग करने के चारों ओर 'कार्यों' पारित करने के लिए किया था, और जब आप फ़ंक्शन को कॉल करने की जरूरत है। एस-भाव एक तरह से आप कार्यक्रम है, जो reification के रूप में जाना जाता है में हेरफेर कर सकता है में कार्यों का प्रतिनिधित्व किया।
हास्केल में, हम आम तौर पर के रूप में लिस्प एस भाव इस तरह के व्यापक reification रणनीतियों, आंशिक रूप से भाषा उन्हें ज़रूरत से बचने के लिए डिज़ाइन किया गया है की जरूरत नहीं है; लेकिन जब से
newtype ReifiedLens s t a b = ReifiedLens (Lens s t a b)
एक बहुरूपी मूल्य लेती हैं और उसे एक सच्चे प्रथम श्रेणी के मूल्य में बदल का एक ही प्रभाव पड़ता है, यह reification रूप में जाना जाता है।
क्यों इस काम है, अगर भाव हमेशा monomorphic प्रकार है? ठीक है, क्योंकि Rank2Types विस्तार एक तिहाई नियम जोड़ता है:
- प्रकार कपोल-कल्पना तथाकथित रैंक 2 प्रकार के साथ, कुछ कार्यों के लिए तर्क के शीर्ष-स्तर पर होते हैं।
ReifiedLens
ऐसा रैंक -2 फ़ंक्शन है; इसलिए जब आप कहते हैं
ReifiedLens l
आप ReifiedLens
को तर्क के चारों ओर एक प्रकार लैम्ब्डा मिलता है, और फिर l
लैम्ब्डा बाध्य प्रकार तर्क करने के लिए तुरंत लागू किया जाता है। तो l
प्रभावी रूप से केवल ईटा-विस्तारित है। (संकलनकर्ता के लिए स्वतंत्र हैं इस ईटा-कम करने और बस सीधे l
उपयोग करें)।
तब, जब आप कहते हैं कि
f (ReifiedLens l) = ...
दाएँ हाथ की ओर पर
, l
, बहुरूपी प्रकार के साथ एक चर रहा है तो l
के हर उपयोग तुरंत परोक्ष जो कुछ भी प्रकार तर्कों को अभिव्यक्ति के लिए आवश्यक हैं करने के लिए सौंपा है टाइप-चेक करें। तो सब कुछ जिस तरह से आप उम्मीद करते हैं काम करता है।
बारे में सोचने की अन्य तरीका है कि, अगर आप कहते हैं कि
newtype ReifiedLens s t a b = ReifiedLens { unReify :: Lens s t a b }
दो कार्य ReifiedLens
और unReify
अधिनियम स्पष्ट प्रकार अमूर्त और आवेदन ऑपरेटरों की तरह है; यह संकलक को यह पहचानने की अनुमति देता है कि आप कहां से अवतार और अनुप्रयोगों को अच्छी तरह से रखना चाहते हैं कि अपमानजनक प्रकार के सिस्टम के साथ समस्याएं नहीं आती हैं।
[1] lens
शब्दावली में, इसे स्पष्ट रूप से 'लेंस' के अलावा कुछ और कहा जाता है; लेंस का मेरा पूरा ज्ञान उन पर एसपीजे की प्रस्तुति से आता है, इसलिए मेरे पास इसका सत्यापन करने का कोई तरीका नहीं है। बिंदु बनी हुई है, क्योंकि पॉलिमॉर्फिज्म अभी भी एक गेटर और एक सेटटर दोनों के रूप में काम करने के लिए आवश्यक है।
- 1. हमें क्यों जारी करना चाहिए?
- 2. हमें एनजी-क्लिक क्यों चाहिए?
- 3. हमें lua_pushinteger() का उपयोग क्यों करना चाहिए?
- 4. हमें हडोप पासवर्ड रहित एसएसएच क्यों चाहिए?
- 5. हमें x86 पर zone_highmem क्यों चाहिए?
- 6. हमें सी # में अक्षर का उपयोग क्यों करना चाहिए?
- 7. धागे शुरू करने के लिए हमें एक रननेबल क्यों चाहिए?
- 8. हमें हमेशा फ़ंक्शन से मूल्य क्यों वापस करना चाहिए?
- 9. हमें HTTP GET, PUT, POST से कुछ और क्यों चाहिए?
- 10. हमें एएसपी .NET 5 wwwroot में web.config क्यों चाहिए?
- 11. हमें उत्पादन सेटअप पर पतले के साथ nginx क्यों चाहिए?
- 12. जावास्क्रिप्ट में कक्षाओं में हमें "var self = this" क्यों चाहिए?
- 13. हमें जावास्क्रिप्ट में ++ का उपयोग क्यों नहीं करना चाहिए?
- 14. हमें केकपीएचपी में सुरक्षा नमक मूल्य क्यों बदलना चाहिए?
- 15. एमवीसी: हमें "नियंत्रक" की आवश्यकता क्यों है, या हमें इस पैटर्न का उपयोग कब करना चाहिए?
- 16. हमें कक्षा का उपयोग कब करना चाहिए और जब हमें
- 17. क्या हमें यूनिट परीक्षण कंसोल आउटपुट चाहिए?
- 18. हमें एक डिफ़ॉल्ट कन्स्ट्रक्टर कब चाहिए?
- 19. क्या हमें बिज़टॉक/ईएसबी पेश करना चाहिए?
- 20. हमें FSharpFunc.Adapt का उपयोग कब करना चाहिए?
- 21. हमें multiprocessing.Pool.join को कब कॉल करना चाहिए?
- 22. क्या हमें यूनिट परीक्षण लॉगिंग करना चाहिए?
- 23. क्या हमें कोरोना रास्ता जाना चाहिए?
- 24. हमें EntityManagerFactory को कब बंद करना चाहिए?
- 25. क्या हमें DI के लिए इंटरफेस चाहिए?
- 26. एसपीएल बनाम ऐरे: हमें एसपीएल का उपयोग कब करना चाहिए और हमें PHP में ऐरे का उपयोग कब करना चाहिए?
- 27. हमें strdup() की आवश्यकता क्यों है?
- 28. हमें फ़ील्ड टैग की आवश्यकता क्यों है?
- 29. क्या हमें हमेशा अपवाद पकड़ना चाहिए, इसे लपेटना चाहिए और इसे पास करना चाहिए?
- 30. हमें "हटाएं []" ऑपरेटर की आवश्यकता क्यों है?
मैं इस स्पष्टीकरण प्यार; काश है कि आपका जवाब प्रारंभिक नई-प्रश्न वोट लहर को याद नहीं कर सका। तत्काल आवेदन प्रकार के लैम्बडास के बारे में थोड़ा सामान्य कारणों से उच्च रैंक प्रकारों को संभालने में आसान कारणों से संबंधित होने की संभावना है। एक मामूली क्विबल: मेरा मानना है कि 'लेंसहेड' को 'लेंस' शब्दावली में लेंस नहीं माना जाएगा, बल्कि एक ट्रैवर्सल होगा, क्योंकि इसे 'आवेदक एफ' की आवश्यकता होती है, न केवल 'फेंक्टर एफ'। – dfeuer