2012-04-26 9 views
7

में एमवीसी ढांचे के लिए लेंस मैं डब्ल्यूपीएफ या एंगुलरजेएस के मोल्ड में हास्केल में एमवीसी फ्रेमवर्क कैसे बनाएगा, इस विचार के आसपास उलझ रहा हूं, लेकिन ऐसा लगता है कि मुख्य प्रकार या विचार नहीं मिल रहा है शुरू कर दिया है। तो दुर्भाग्य से अस्पष्ट सवाल - क्या इस समस्या के बारे में सोचने से कोई और है?हास्केल

मुझे संपादन-लेंस, बहु-प्लेट और कंपोज़ दिखाई देता है, लेकिन मुझे लगता है कि वे सभी थोड़ा अलग समस्याएं हल करते हैं।

कि कैसे होगा काम करेगा का मेरा स्केच:

  1. एक सादे Haskell डेटा संरचना
  2. के रूप में एक मॉडल बनाएँ 'लेंस' का एक सेट या अपने मॉडल को संशोधित करने के आदेश देता है।
  3. एक HTML (या जो भी) टेम्पलेट लिखें जो मॉडल के प्रकारों द्वारा पैरामीट किया गया है।

। मेरे विचार के कुछ हिस्सों को अद्यतन करने के जब मैं एक लेंस लागू

Model -> Template Model -> Html 

और एक समारोह:

data Model = Page { _title :: String, _content :: [(Int, String)] } 

title :: Lens Model String 
content :: Int -> Lens Model (Maybe String) 

तो मैं एक समारोह में लिखने के लिए सक्षम होने के लिए चाहते हैं।

Lens Model a -> a -> HtmlTemplate Model -> [(Path, Html)] 

तो मुझे लगता है कि सवाल यह है कि - किस प्रकार एक लेंस ले जाएगा जो एक डेटा संरचना पर काम कर सकते हैं, तो दूसरी में परिवर्तन का वर्णन करने के लिए इस्तेमाल किया जा।

एक संभावना एक जीएडीटी बनाने के लिए प्रतीत होता है जो सभी लेंस लपेटता है और फिर HTML को GADT प्रकार पर टेम्पलेट करता है जिसका उपयोग प्रत्येक चरण में टेम्पलेट के खिलाफ मिलान करने के लिए किया जा सकता है। जैसे

data Lenses a b where 
    Title :: Lens Model String -> Lenses Model String 
    Item :: Lens Model String -> Lenses Model (Maybe String) 

फिर एक HTML टेम्पलेट डेटा प्रकार उदा।

data HtmlTemplate a = Text String 
       | Element String [Attrib a] 
       | forall b. Binding (Lenses a b) (Html b) 

जिस पर बाध्यकारी तत्व सीधे पैटर्न के साथ मिलान किया जा सकता है।

लेकिन यह लगभग बिंदु को हराने लगता है, क्योंकि मॉडल तब दृश्य में हिप में शामिल हो गया है।

मुझे आश्चर्य है कि कोई भी (मुझे चालाक) बाहर रखता है कि यह कैसे काम कर सकता है? या यहां तक ​​कि अगर यह एक अच्छा विचार है?

+1

मैंने मनमाने ढंग से प्रभावशाली संचालन का समर्थन करने के लिए एक प्रयोगात्मक लेंस लाइब्रेरी शुरू की है, जिसे आप देखना चाहते हैं (इस समय आप इसका उपयोग करने की अनुशंसा नहीं कर सकते क्योंकि एपीआई बदल जाएगा, यह प्रयोगात्मक है, और गोल था जब reddit पर चर्चा की गई थी उस पर बकवास)। आपके मामले के सबसे नज़दीकी [इस पोस्ट] में अंतिम उदाहरण होगा (http://brandon.si/code/yall/); जब आप मॉडल पर लेंस ऑप्स करते हैं तो संभवतः आप 'दृश्य' में अपना दृश्य संशोधित करना चाहते हैं: 'लेंसएम (स्टेट व्यू) मॉडल ए' या ऐसा कुछ। लेकिन मैंने एमवीसी पैटर्न का अधिक उपयोग नहीं किया है, इसलिए मुझे माफ़ कर दो अगर मैं – jberryman

+0

बंद कर रहा हूं तो मुझे लगता है कि कम से कम समाधान का आधा हिस्सा है, ताकि आप या तो दृश्य में अपने परिवर्तनों को बढ़ा सकें (या सीधे दृश्य को संशोधित कर सकें) । हालांकि मुझे लगता है कि मैं जो खो रहा हूं वह मॉडल और दृश्य (टेम्पलेट मॉडल) को एक साथ करने के लिए एक तंत्र है - एक ही समय में दो संबंधित संरचनाओं को पार करने के लिए किसी प्रकार का ज़िप। – Oliver

+0

आपको रुचि हो सकती है http://www.haskellforall.com/2014/04/model-view-controller-haskell-style.html – hdgarrood

उत्तर

9

मैं हास्केल में लेंस-आधारित "एमवीसी" का उपयोग करके एक बड़ा वाणिज्यिक अनुप्रयोग बना रहा हूं।

  • पूरी तरह कार्यात्मक डेटा संरचनाओं की स्थापना और हो रही है (और डेटा अनुरूप रखते) के लिए
  • लेंस
  • (टेम्पलेट) प्रत्येक लेंस से बंधा एक दृश्य पैदा करने के लिए एक DSL।

यह एक अच्छा अनुभव रहा है, और मैं निश्चित रूप से जटिल संरचनाओं के विस्तृत संरचना संपादन के लिए दृष्टिकोण की अनुशंसा करता हूं।

दृष्टिकोण बलों आप

को
  • हैक नहीं है, लेकिन अपने आंतरिक मॉडल
  • मॉडल के मजबूत जुदाई के रूप में सुरक्षित उपयोग लेंस इंटरफेस -> दृश्य
  • प्रकार सब कुछ के लिए जाँच - लेंस प्रकार व्यू कोड

ऐसे कई तरीके हैं जिन्हें आप डिज़ाइन कर सकते हैं, लेकिन मुझे लगता है कि यह एक बहुत ही ध्वनि डिजाइन दृष्टिकोण है। आप जीयूआई भाग के लिए अच्छा डीएसएल समर्थन चाहते हैं।

+2

क्या आप प्रत्येक लेंस से जुड़ा एक दृश्य (टेम्पलेट) उत्पन्न करने के लिए "एक डीएसएल" पर विस्तार कर सकते हैं । "? अच्छा लगता है। – jberryman

+1

असल में, एक टेम्पलेट भाषा जो स्क्रीन पर अपने संबंधित लेंस के साथ टाइप किए गए नियंत्रण को जोड़ती है। इसलिए बटन, टेक्स्ट इनपुट, संख्यात्मक इनपुट इत्यादि को उस इनपुट के लिए संपादन लेंस से जोड़ा जा सकता है, और ऐसे लेंस के आलेखों को तारित किया जा सकता है। यूआई तो बस बाहर गिर जाता है। –

+0

अच्छा लगता है। मैं एक समान विधि का उपयोग कर यूआईटी के रूप में एचटीएमएल का उपयोग कर स्थानीय वेब ऐप्स करना चाहता हूं। (या कुछ दिन यूएचसी जावास्क्रिप्ट के साथ)। चीयर्स :) – Oliver