2015-10-12 9 views
8

एक recent question मुझे कैसे एकमैं पॉलीमोर्फिज्म को डेटा संरचना में कैसे दबा सकता हूं?

[ReifiedLens s t a b] 

में एक

forall f . Functor f => [LensLike f s t a b] 

कन्वर्ट करने के लिए एक आसान तरीका यह वास्तव में धीरे-धीरे ऐसा करने के लिए, !! के साथ इस सूची में अनुक्रमण द्वारा नहीं है आश्चर्य करने के लिए नेतृत्व, लेकिन यह काफी अविश्वसनीय है अक्षम। ऐसा लगता है कि reflection में उपयोग किए गए एक की तरह एक चाल खींचने के लिए पर्याप्त पैरामीट्रिकिटी होनी चाहिए, लेकिन मुझे कुछ भी पता नहीं लग रहा है। क्या यह कुशलतापूर्वक ऐसा करना संभव है?

+2

मुझे नहीं लगता कि यह भी संभव है। हमें 'फंक्टर एफ -> [लेंसलाइक एफ एस टी ए बी]' से '(फंक्चरर एफ -> लेंसलाइक एफ एस टी ए बी]' (परिचालन रूप से) जाना होगा। शुरू करने के लिए सूची खींचने के लिए हमें 'फेंक्टर एफ' में पास करने की आवश्यकता है, और वहां कोई भी नहीं है। –

+2

@ AndrásKovács शायद हम खुद को यह समझाने के लिए एक पैरामीट्रिटी तर्क का उपयोग कर सकते हैं कि 'फेंक्टर एफ -> [लेंसलाइक एफ एस टी ए बी] प्रकार के कार्यों को' फ़ैक्टर एफ 'तर्क को सार्थक तरीके से निरीक्षण किए बिना उनकी परिणाम सूची की लंबाई चुननी चाहिए। फिर वहां से बाकी रास्ता प्राप्त करना आसान है। (बेशक यह दावा कुछ विशेष 'एफ'' के लिए 'फेंक्टर एफ -> [लेंसलाइक एफ एस टी ए बी]' के कार्यों के बारे में स्पष्ट रूप से सच नहीं है। –

+0

@ एंड्रसकोवाक्स, जो मेरा डर था। हमें किसी प्रकार का "सुपरफंक्टर" शब्दकोश चाहिए जो हम पास कर सकते हैं जो जादुई रूप से किसी भी अन्य 'फंक्टर' शब्दकोश की पहचान लेने में सक्षम होगा। – dfeuer

उत्तर

5

परीक्षण टिप्पणी में मेरा विचार है, तो आप वास्तव में यह लिख सकते हैं सीधे ALens के माध्यम से गुजर द्वारा:

convert :: (forall f. Functor f => [LensLike f s t a b]) -> [ReifiedLens s t a b] 
convert ls = [Lens (cloneLens l) | l <- ls] 

ALensPretext functor पर आधारित है:

type ALens s t a b = LensLike (Pretext (->) a b) s t a b 

newtype Pretext p a b t = Pretext { runPretext :: forall f. Functor f => p a (f b) -> f t } 

यह एक का उपयोग कर की अनुमति देता है कम से कम लेंस उपयोग के लिए, उन सभी का प्रतिनिधित्व करने के लिए एकल Functor

मैं अभी भी सोच रहा हूं कि एक ऐसी विधि है जो आम तौर पर लेंस के लिए काम करती है।

+0

मुझे अभी भी 'प्रीटेक्स्ट' परेशानी मिल रही है। जैसा कि '(->) 'पर लागू होता है, मैं इसे आंशिक रूप से लागू लेंस के रूप में देख सकता हूं, लेकिन इसकी उपयोगिता और सामान्यता अभी भी मुझे भ्रमित करती है। – dfeuer

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