2009-11-14 5 views
5

Emacs में चल रहा XP में डॉस कमांड लाइन पर GHCi 6.10.4 उपयोग कर रहा हूँ, और यह भी Haskell-मोड-2,4आप कैसे एक समारोह के लिए एक फ़ाइल से मार्ग stdin करते हैं जब GHCi

का उपयोग करते समय कार्यक्रमों को चलाने जो stdin पर काम करता है, क्या कोई तरीका है कि मैं एक फ़ाइल को stdin होने के लिए रीडायरेक्ट कर सकता हूं? उदाहरण के लिए यदि मेरे पास मुख्य नामक एक फ़ंक्शन है जो stdin से पढ़ता है, तो मैं नहीं कर सकता:

*Main> main < words.txt 

क्या कोई और तरीका है?

इसके अलावा मैं काम करने के लिए प्रतीत होता है, जो ghci खिड़की में stdin टाइप करने में सक्षम होना चाहते हैं, लेकिन ईओएफ कुंजी क्या है? मैंने सोचा कि यह Ctrl-D था लेकिन यह काम नहीं करता है।

+3

मैं डॉस/विंडोज़ में विश्वास करता हूं Ctrl-Z ईओएफ कुंजी है ... – Suppressingfire

+0

आह हाँ। मैंने कोशिश की और सोचा कि यह असफल रहा है, लेकिन वास्तव में काम करता है, लेकिन फिर नीचे दिए गए उत्तर के रूप में, यह stdin को भी बंद कर देता है और आपको एक त्रुटि संदेश मिलता है जैसे: * मुख्य>: hLookAhead: अवैध तर्क (खराब फ़ाइल वर्णनकर्ता) – justinhj

उत्तर

6

यदि आप फ़ाइल को खोलने के लिए अपने main को फिर से काम करते हैं तो यह आसान होगा। GHCi भीतर जबकि

import System.Environment 
import System.IO 

main :: IO() 
main = do 
    args <- getArgs 
    case args of 
     [] -> doStuff stdin 
     file:_ -> 
     withFile file ReadMode doStuff 

doStuff :: Handle -> IO() 
doStuff = … 
 
*Main> System.Environment.withArgs ["main.txt"] main 

stdin पर एक EOF न दें। यदि आप करते हैं, सब आगे प्रयास stdin से पढ़ने के लिए असफल हो जायेगी:

 
Prelude> getLine 
*** Exception: <stdin>: hGetLine: illegal operation (handle is closed) 
Prelude> getContents 
*** Exception: <stdin>: hGetContents: illegal operation (handle is closed) 
+0

धन्यवाद, यह सहायक है। – justinhj

+0

सिगविन पर, CTRL + C फ़ाइल ऑपरेशन को बंद करते समय एक ऑपरेशन रद्द करना प्रतीत होता है? हैंडल बंद किए बिना आप ऑपरेशन को कैसे रद्द करते हैं? – CMCDragonkai

3

आप टाइप कर सकते: GHCi में मुख्य आदेश पंक्ति पैरामीटर आह्वान करने के लिए। मुझे डर है कि आप शायद इसका इस्तेमाल करना चाहेंगे।

+1

+1 वाह, उन्होंने कब जोड़ा? यह निश्चित रूप से '... से अधिक है ...' – ephemient

+3

यह आसान है लेकिन आप इस तरह stdin को रीडायरेक्ट नहीं कर सकते: : मुख्य justinhj

+1

क्षमा करें, लेकिन मैं लंबे समय तक हैकेल का उपयोग नहीं कर रहा हूं, इसलिए यह यहां तक ​​कि मैं याद कर सकते हैं। और जस्टिन्ह, क्यों कोशिश नहीं करते? मुख्य = करें {args <- getArgs; फ़ाइल = सिर तर्क देता है; सामग्री <- पढ़ें फ़ाइल फ़ाइल; hPutStr stdin सामग्री; ...} फिर आप कर सकते हैं: मुख्य शब्द.txt – codebliss

संबंधित मुद्दे