आप स्ट्रीम प्रोसेसर का उपयोग करके एफआरपी के सीमित रूप को कार्यान्वित कर सकते हैं। उदाहरण के लिए, pipes
लाइब्रेरी का उपयोग कर, आप की घटनाओं का एक स्रोत से परिभाषित करें:
mouseCoordinates :: (Proxy p) =>() -> Producer p MouseCoord IO r
... और आप इसी तरह एक ग्राफिकल हैंडलर है कि माउस निर्देशांक लेता है और एक कैनवास पर एक कर्सर को अद्यतन करता से परिभाषित करें:
coordHandler :: (Proxy p) =>() -> Consumer p MouseCoord IO r
तो फिर तुम रचना का उपयोग कर हैंडलर करने के लिए माउस घटनाओं ऊपर हुक होगा:
>>> runProxy $ mouseCoordinates >-> coordHandler
और यह सिर्फ आपकी अपेक्षानुसार चलाए जा सकें।
जैसा कि आपने कहा था, यह चरणों की एक श्रृंखला के लिए अच्छी तरह से काम करता है, लेकिन अधिक मनमानी टोपोलॉजी के बारे में क्या? खैर, यह पता चला है कि केंद्रीय Proxy
pipes
का प्रकार एक मोनड ट्रांसफॉर्मर है, इसलिए आप अपने आप के ऊपर प्रॉक्सी मोनैड ट्रांसफार्मर घोंसले से किसी भी मनमाने ढंग से टोपोलॉजी का मॉडल कर सकते हैं। उदाहरण के लिए, यहां बताया गया है कि आप दो इनपुट धाराओं को कैसे ज़िप करेंगे:
zipD
:: (Monad m, Proxy p1, Proxy p2, Proxy p3)
=>() -> Consumer p1 a (Consumer p2 b (Producer p3 (a, b) m)) r
zipD() = runIdentityP $ hoist (runIdentityP . hoist runIdentityP) $ forever $ do
a <- request() -- Request from the outer Consumer
b <- lift $ request() -- Request from the inner consumer
lift $ lift $ respond (a, b) -- Respond to the Producer
यह एक करीबी कार्य की तरह व्यवहार करता है। आप इसे आंशिक रूप से प्रत्येक इनपुट पर आंशिक रूप से लागू करते हैं और फिर इसे पूर्ण रूप से लागू होने पर इसे चला सकते हैं।
>>> p3
(1, 4)
(2, 5)
(3, 6)
यह चाल किसी भी टोपोलॉजी को सामान्यीकृत:
-- 1st application
p1 = runProxyK $ zipD <-< fromListS [1..]
-- 2nd application
p2 = runProxyK $ p2 <-< fromListS [4..6]
-- 3rd application
p3 = runProxy $ printD <-< p3
यह सिर्फ आपकी अपेक्षानुसार चलाता है।आप "शाखाओं, ज़िपों और विलय" खंड में Control.Proxy.Tutorial में इसके बारे में बहुत अधिक जानकारी प्राप्त कर सकते हैं। विशेष रूप से, आपको fork
संयोजक को यह देखना चाहिए कि यह एक उदाहरण के रूप में उपयोग करता है, जो आपको एक स्ट्रीम को दो आउटपुट में विभाजित करने देता है।
आह, मैं कुछ ऐसा ही पोस्ट करने वाला था, लेकिन मैं वास्तव में एक एएफआरपी लाइब्रेरी लिखने वाले व्यक्ति की विशेषज्ञता को रोक दूंगा। :] –
ऐसा लगता है कि (ए) एफआरपी का उपयोग करके मैं एक विश्वकोश ग्राफ संरचना तक ही सीमित नहीं होगा, क्या यह सच है? – fho
यह आपके उत्तर से मुझे स्पष्ट नहीं है कि अगर एएफआरपी के किसी भी पहलू को शर्तों में लागू नहीं किया जा सकता है या हालिया धारा में लाइब्रेरीज़ कंड्यूट/पाइप हैं? – Davorak