पुनरावृत्ति के बराबर हास्केल रिकर्सन है। यदि आपको इनपुट की रेखाएं पढ़नी होंगी तो आपको IO
मोनैड में भी काम करने की आवश्यकता होगी। सामान्य तस्वीर है:
import Control.Monad
main = do
line <- getLine
unless (line == "q") $ do
-- process line
main
तुम सिर्फ content
में सभी पढ़ने लाइनों जमा करने के लिए चाहते हैं, आप ऐसा करने की जरूरत नहीं है। बस getContents
का उपयोग करें जो सभी उपयोगकर्ता इनपुट को पुनर्प्राप्त (आलसी) करेगा। जब आप 'q'
देखते हैं तो बस रुकें। काफी मुहावरेदार हास्केल में, पढ़ने कोड की एक पंक्ति में किया जा सकता है:
main = mapM_ process . takeWhile (/= "q") . lines =<< getContents
where process line = do -- whatever you like, e.g.
putStrLn line
आप दाएं से बाएं कोड की पहली पंक्ति पढ़ते हैं, यह कहते हैं:
प्राप्त सबकुछ जो उपयोगकर्ता इनपुट के रूप में प्रदान करेगा (कभी डर नहीं, यह आलसी है);
इसे लाइनों में विभाजित करता है जैसा कि यह आता है;
केवल तब तक लाइनें लें जब तक वे "क्यू" के बराबर न हों, जब आप ऐसी रेखा देखते हैं तो रोकें;
और प्रत्येक पंक्ति के लिए process
पर कॉल करें।
यदि आप इसे पहले से नहीं समझ पाए हैं, तो आपको ध्यान से एक हास्केल ट्यूटोरियल पढ़ने की आवश्यकता है!
अब, क्या आप वास्तव में हास्केल में इसे लिखेंगे? 'Line' में 'सामग्री' को हर बार जोड़ना आपको खराब प्रदर्शन देता है। 'सामग्री' जो आप अंत में चाहते हैं वह एक उपसर्ग है कि 'getContents' के लिए एक कॉल आपको क्या देगी। – nickie
यह एक उचित बिंदु है - लेकिन मैंने सोचा कि यह आईओ मोनैड में काम करने के लिए एक महसूस करने के लिए "ग्राउंड अप से" कैसे करना है, यह समझाने लायक था (जो शायद नए लोगों के लिए हास्केल का सबसे भ्रमित हिस्सा है)। इनपुट में किए जाने वाले प्रसंस्करण से उपयोगकर्ता इनपुट को अलग करने का भी लाभ होता है, जिसका आपका उत्तर नहीं है। मैं 'getContents.' –
के बारे में एक परिशिष्ट जोड़ूंगा, ठीक है, मैं अपना प्रारंभिक -1 वापस ले रहा हूं। लेकिन, शैक्षणिक उद्देश्यों को छोड़ दिया गया, मैं इस बुरे हास्केल जैसे कोड पर विचार करूंगा। जो लोग देखभाल करते हैं, कम से कम ... :-) – nickie