2010-10-08 33 views
9

मैं हास्केल के लिए काफी नया हूं, इसलिए मैं getLine का उपयोग करने के बजाय, कीप्रेस का पता लगाने के लिए एक सरल-आसान तरीका ढूंढ रहा हूं।हास्केल में कुंजीपटलों का इंतजार करने के लिए इंतजार करने का एक आसान तरीका क्या है?

अगर कोई भी पुस्तकालय जानता है, या ऐसा करने के लिए कुछ चाल है, तो यह बहुत अच्छा होगा!

और यदि यह पूछने के लिए कोई बेहतर जगह है, तो कृपया मुझे वहां निर्देशित करें, मैं इसकी सराहना करता हूं।

+0

यहां एक समान धागा है http://stackoverflow.com/questions/2983974/haskell-read-input-character-from-console-immediately-not-after-newline –

+0

अधिकांश जीयूआई पुस्तकालय (उदा: gtk2hs) हैं एक ऑनकेप प्रकार का ऑपरेशन - यदि आप कुछ भी बड़ा या वितरण के लिए कर रहे हैं तो उन पर विचार करें। –

उत्तर

14

आप अवरुद्ध आप hReady का उपयोग पता लगाने के लिए एक महत्वपूर्ण अभी तक दबाया गया है कि क्या कर सकते हैं नहीं करना चाहते हैं। यह उन खेलों के लिए उपयोगी है जहां आप प्रोग्राम को चलाने के लिए चाहते हैं और जब भी गेम को रोक दिए बिना यह एक महत्वपूर्ण प्रेस उठाता है।

ifReadyDo :: Handle -> IO a -> IO (Maybe a) 
ifReadyDo hnd x = hReady hnd >>= f 
    where f True = x >>= return . Just 
     f _ = return Nothing 

कौन इस तरह इस्तेमाल किया जा सकता:

stdin `ifReadyDo` getChar 

एक Maybe कि है Just अगर एक कुंजी दबाने किया गया था और Nothing अन्यथा रिटर्निंग

यहाँ एक सुविधा समारोह मैं इस के लिए उपयोग करते हैं।

+2

मैं' hSetEcho' फ़ंक्शन के बारे में भी उल्लेख करता हूं, जो अक्षर को प्रतिबिंबित करने के लिए अक्षर को प्रतिबिंबित करने की अनुमति देता है ' 'getChar' का उपयोग करते समय, stdout'। –

8
import System.IO 

main :: IO() 
main = do 
    hSetBuffering stdin NoBuffering 
    x <- getChar 
    putStrLn ("You pressed: " ++ [x]) 

मुझे नहीं पता कि यह काम करने की गारंटी कब है। टर्मिनल को "कच्चे" मोड में रखना सिस्टम-निर्भर प्रक्रिया है। लेकिन यह मेरे लिए लिनक्स पर जीएचसी 6.12.1 के साथ काम करता है।

+1

लेकिन यह जीएचसी का उपयोग कर विंडोज पर काम नहीं करता है। –

+0

यही वह मुद्दा है जो मैंने पाया है, यह विंडोज़ पर खराब काम करता है, और इसे प्रस्तुत करने से पहले एक नई लाइन की आवश्यकता होती है। – TaslemGuy

-1

आप getchar बजाय की getLine उपयोग कर सकते हैं। यह शायद वह नहीं है जिसे आप ढूंढ रहे हैं, लेकिन यह सबसे आसान तरीका है।

pressKey :: IO() 
pressKey = do x <- getChar 
       return x 

लेकिन एक आसान तरीका भी है। बस getchar लिखें:

pressKey :: IO() 
pressKey = getChar >> putStr "I am a String" 

pressKey = putStrLn "Hi" >> getChar >> putStrLn "Bye" 
+1

आपकी पहली 'प्रेसकी' बिल्कुल अपने यहां 'getChar' के बराबर है। –

+0

ठीक है, मुझे पता है कि। मेरा मुद्दा यह था कि एक्स का उपयोग किया जा सकता था, उदाहरण के लिए, "do {x <- getCbar; dosomething (x :: int पढ़ें}} या नहीं। – danportin

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