2013-01-06 11 views
6

मेरे पास एक लंबी दौड़ वाली गणना है जो एक सूची आउटपुट करती है। मैं इस सूची से मानों को आउटपुट के रूप में आउटपुट करना चाहता हूं। ऐसा करने के लिए एक साफ तरीका क्या होगा?मुझे किसी सूची से मूल्यों को आउटपुट के रूप में कैसे आउटपुट करना चाहिए?

वर्तमान में मैं प्रत्येक मूल्य को STDOUT पर प्रिंट करने के लिए mapM_ print का उपयोग करता हूं। यह कमांड लाइन पर प्रिंटिंग मानों के साधारण मामले के लिए काफी अच्छा काम करता है, लेकिन थोड़ा सा हैकी और काम करने में मुश्किल लगता है।

इसके अतिरिक्त, कुछ बिंदु पर, मैं अपने कमांड लाइन आउटपुट को एक इंटरैक्टिव विज़ुअलाइजेशन में बदलना चाहता हूं। मैं अपनी सूची को एफआरपी से घटनाओं की धारा की तरह कुछ कैसे बदल सकता हूं? घटनाओं के स्रोत के रूप में मौजूदा जीयूआई ढांचे में प्लग करने में सक्षम होने के नाते यह बहुत अच्छा होगा।

किसी सूची के अलावा किसी अन्य चीज़ का उपयोग करने के लिए फ़ंक्शन को पुनर्लेखन करना एक विकल्प है, हालांकि एक समाधान जो मुझे सूची लेने की अनुमति देता है-आदर्श होगा।

+0

के बाद से हास्केल में सूचियों आलसी और 'mapM_' भी उन लोगों के साथ अच्छी तरह से काम कर रहे हैं, मुझे लगता है कि डिफ़ॉल्ट समाधान काफी अच्छा है। यह सुनिश्चित करने के लिए बस 'hFlush stdout' का उपयोग करें कि आउटपुट वास्तव में फ़्लश किया गया है (जैसे' mapM_ (hFlush stdout << print')। –

उत्तर

6

यह पुस्तकालयों की तरह पुनरावृत्तियों और पुनरावृत्तियों के लिए एक नौकरी है।

Proxy लाइब्रेरी का उपयोग करना।

import Control.Proxy 

runProxy $ fromListS [1..10] >-> <processing> >-> printD >-> <more> processing> 

जहां <processing> अतिरिक्त गणना है जो आपको बनाने की आवश्यकता है।

इसी प्रकार के प्रश्न: lazy version of mapM, Is Haskell's mapM not lazy?

उदाहरण के लिए:

> labeledPrint label x = putStrLn $ label ++ show x 
> runProxy $ fromListS [1..4] >-> printD >-> mapD (*2) 
           >-> useD (labeledPrint "Second printer: ") 
1 
Second printer: 2 
2 
Second printer: 4 
3 
Second printer: 6 
4 
Second printer: 8 

यदि आपने ऐप्लिकेशन का क्रम उलटने और <-< बजाय >-> का उपयोग तो यह सामान्य कार्य आवेदन की तरह दिखता है।

runProxy $ useD (labeledPrint "Second printer: ") <-< mapD (*2) 
                <-< printD 
                <-< fromListS [1..4] 
+1

यदि आप बदलना नहीं चाहते हैं तो आप 'mapMD' के बजाय' useD' का भी उपयोग कर सकते हैं मूल्य डाउनस्ट्रीम बह रहा है। –

+1

यह एक अच्छा विचार है इसलिए मैंने इसे ऊपर लागू किया। – Davorak