2015-10-12 11 views

उत्तर

11

हमें संशोधित लेंस की आवश्यकता है क्योंकि हास्केल की प्रकार प्रणाली अनुमानित है। मुझे लगता है कि वास्तव में क्या मतलब है की तकनीकी जानकारी नहीं पता है, लेकिन यह

[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 शब्दकोश लेता है और एक सूची लौटाती है कार्यों की एक सूची है।

"पुनरुत्थान" का अर्थ क्या है, ठीक है, शब्दकोश कुछ कहेंगे, और ऐसा लगता है कि हास्केल में विशिष्ट अर्थों की एक अपेक्षाकृत विविधता में अनुवाद करना प्रतीत होता है। तो उस पर कोई टिप्पणी नहीं है।

5

समस्या यह है कि, हास्केल में, टाइप एब्स्ट्रक्शन और एप्लिकेशन पूरी तरह निहित हैं; कंपाइलर को जहां आवश्यक हो वहां डालना चाहिए। 'अपमानजनक' एक्सटेंशन को डिजाइन करने के कई प्रयास, जहां संकलक चालाक अनुमान लगाएगा कि उन्हें कहां रखा जाए, असफल रहे;

  • प्रकार कपोल-कल्पना केवल एक समारोह परिभाषा के शीर्ष स्तर पर होते हैं: तो सबसे सुरक्षित बात हास्केल 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 शब्दावली में, इसे स्पष्ट रूप से 'लेंस' के अलावा कुछ और कहा जाता है; लेंस का मेरा पूरा ज्ञान उन पर एसपीजे की प्रस्तुति से आता है, इसलिए मेरे पास इसका सत्यापन करने का कोई तरीका नहीं है। बिंदु बनी हुई है, क्योंकि पॉलिमॉर्फिज्म अभी भी एक गेटर और एक सेटटर दोनों के रूप में काम करने के लिए आवश्यक है।

+0

मैं इस स्पष्टीकरण प्यार; काश है कि आपका जवाब प्रारंभिक नई-प्रश्न वोट लहर को याद नहीं कर सका। तत्काल आवेदन प्रकार के लैम्बडास के बारे में थोड़ा सामान्य कारणों से उच्च रैंक प्रकारों को संभालने में आसान कारणों से संबंधित होने की संभावना है। एक मामूली क्विबल: मेरा मानना ​​है कि 'लेंसहेड' को 'लेंस' शब्दावली में लेंस नहीं माना जाएगा, बल्कि एक ट्रैवर्सल होगा, क्योंकि इसे 'आवेदक एफ' की आवश्यकता होती है, न केवल 'फेंक्टर एफ'। – dfeuer

संबंधित मुद्दे