मैं एक मोनैड ट्रांसफार्मर की तलाश में हूं जिसका उपयोग किसी प्रक्रिया की प्रगति को ट्रैक करने के लिए किया जा सकता है। मुझे पता है step
क्योंकि monadic कानूनों की स्पष्ट रूप से मौजूद नहीं है, और task
है कि इस कार्यक्रम के नियतिवाद की वजह से एक स्पष्ट कदम संख्या पैरामीटर के लिए/प्रगति ट्रैकिंग के लिए मोनाड ट्रांसफार्मर
procedure :: ProgressT IO()
procedure = task "Print some lines" 3 $ do
liftIO $ putStrLn "line1"
step
task "Print a complicated line" 2 $ do
liftIO $ putStr "li"
step
liftIO $ putStrLn "ne2"
step
liftIO $ putStrLn "line3"
-- Wraps an action in a task
task :: Monad m
=> String -- Name of task
-> Int -- Number of steps to complete task
-> ProgressT m a -- Action performing the task
-> ProgressT m a
-- Marks one step of the current task as completed
step :: Monad m => ProgressT m()
: यह कैसे उपयोग किया जाएगा समझाने के लिए, निम्न कोड पर विचार रोकथाम की समस्या।
इकाई के रूप में ऊपर वर्णित है, के रूप में मैं इसे देख, दो तरीकों में से एक में लागू किया जा सकता है: एक समारोह है कि वर्तमान कार्य का नाम/कदम सूचकांक ढेर हो जाएंगे और में एक निरंतरता के माध्यम से
- इस बिंदु पर प्रक्रिया कि यह छोड़ दिया। लौटे निरंतरता पर बार-बार इस फ़ंक्शन को कॉल करना प्रक्रिया के निष्पादन को पूरा करेगा।
- एक फ़ंक्शन के माध्यम से एक कार्यवाही करने का वर्णन किया गया है कि कार्य कार्य पूरा होने पर क्या करना है। जब तक यह पूरा नहीं किया जाता है, तब तक प्रक्रिया अनियंत्रित रूप से चलती है, प्रदान की गई कार्रवाई के माध्यम से परिवर्तन के बारे में पर्यावरण को "सूचित" करती है।
समाधान के लिए (1), मैंने पर Yield
निलंबन फ़ैक्टर के साथ देखा है। समाधान के लिए (2), मुझे किसी भी पहले से उपलब्ध मोनैड ट्रांसफार्मर के बारे में पता नहीं है जो उपयोगी होगा।
जो समाधान मैं ढूंढ रहा हूं उसके पास बहुत अधिक प्रदर्शन ओवरहेड नहीं होना चाहिए और जितना संभव हो सके प्रक्रिया पर अधिक नियंत्रण की अनुमति दें (उदा। आईओ एक्सेस या कुछ की आवश्यकता नहीं है)।
इन समाधानों में से कोई एक ध्वनि व्यवहार्य है, या इस समस्या के लिए कहीं और समाधान हैं? क्या इस समस्या को पहले से ही एक मोनैड ट्रांसफॉर्मर के साथ हल किया गया है जिसे मैं ढूंढने में असमर्थ हूं?
संपादित करें: लक्ष्य यह जांचना नहीं है कि सभी कदम किए गए हैं या नहीं। लक्ष्य यह चल रहा है कि प्रक्रिया को "निगरानी" करने में सक्षम होना चाहिए, ताकि कोई यह बता सके कि इसमें से कितना पूरा हो गया है।
आप निरंतरता का उल्लेख किया ... शायद मुझे कुछ स्पष्ट याद आ रही है लेकिन मुझे आश्चर्य है कि क्या आप सी का उपयोग कर सकते हैं ontinuation monad ट्रांसफॉर्मर 'ContT'। – mergeconflict
जब तक आप 'putStr' और' putStrLn' को 'स्ट्रिंग -> प्रोग्रेसटी आईओ()' प्रकार के साथ अनुपूरित नहीं करते हैं, तो आपको उन्हें उठाना होगा। ऐसा करने के लिए 'liftIO' का उपयोग करें। –
प्रगति जानकारी का निर्माण और प्रदर्शन एक प्रकाशित/सदस्यता प्रणाली है। हुड के तहत इसे कैसे कार्यान्वित किया जाए इस पर निर्भर करेगा कि मुख्य धागा या विशेष अन्य थ्रेड या कई अन्य धागे प्रगति स्थिति पर कार्य करेंगे या नहीं। –