2012-04-23 13 views
8

में एन लाइनें पढ़ें मैं स्ट्रिंग्स की सूची में n सामग्री की रेखाओं को पढ़ने की कोशिश कर रहा हूं। मैंने नीचे दिए गए कोड के कई बदलावों की कोशिश की है, लेकिन कुछ भी काम नहीं किया है।एन [स्ट्रिंग]

main = do 
    input <- getLine 
    inputs <- mapM getLine [1..read input] 
    print $ length input 

यह निम्न त्रुटि फेंकता है:

Couldn't match expected type `a0 -> IO b0' 
       with actual type `IO String' 
    In the first argument of `mapM', namely `getLine' 
    In a stmt of a 'do' block: inputs <- mapM getLine [1 .. read input] 
    In the expression: 
     do { input <- getLine; 
      inputs <- mapM getLine [1 .. read input]; 
      print $ length input } 

और

main = do 
    input <- getLine 
    let inputs = map getLine [1..read input] 
    print $ length input 

फेंकता

Couldn't match expected type `a0 -> b0' 
       with actual type `IO String' 
    In the first argument of `map', namely `getLine' 
    In the expression: map getLine [1 .. read input] 
    In an equation for `inputs': inputs = map getLine [1 .. read input] 

मैं यह कैसे कर सकते?

+3

वैसे, 'इनपुट <- मैपएम (कॉन्स गेटलाइन) [1 .. इनपुट पढ़ें]' वही है जो आपको चाहिए। समस्या यह है कि आप संख्याओं पर 'getLine' को मानचित्रित करने का प्रयास करते हैं' [1 .. n] 'लेकिन' getLine' एक फ़ंक्शन नहीं है। 'Const' का उपयोग करके, आप इसे उस फ़ंक्शन में बदल देते हैं जो इसके पहले तर्क को अनदेखा करता है। – Vitus

+0

@ विटस जो एक और उत्तर के रूप में योग्य है, मैं इसे +1 कर दूंगा। – vikingsteve

उत्तर

42

उपयोग replicateMControl.Monad से:

main = do 
    input <- getLine 
    inputs <- replicateM (read input) getLine 
    print $ length inputs 

एक आदमी एक मछली दे/मछली के एक आदमी को पढ़ाने की भावना में: आप स्वयं इस Hoogle खोज के द्वारा पाया जा सकता था।

आपके पास:

  • एक कार्रवाई वह कार्रवाई करने IO String
  • कई बार प्रकार का प्रदर्शन करने के लिए (प्रकार Int)

आप चाहते हैं:

  • IO [String]
  • की एक क्रिया

तो आप search Hoogle for (IO String) -> Int -> (IO [String]) कर सकते थे। replicateM पहली हिट है।

0

एक और तरीका यह है कि आप यह क्रिया कर सकते हैं शुद्ध प्रतिलिपि और sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) उपकरण का उपयोग कर। आइए पहले कहें कि हम एक गिनती मांगेंगे और फिर टर्मिनल पर अपनी राशि प्रिंट करने के लिए कई पूर्णांक मांगेंगे।

sumCountManyData :: IO() 
sumCountManyData = putStr "How many integers to sum..? " 
        >> getLine 
        >>= sequence . flip replicate getLine . read 
        >>= print . sum . map read 
संबंधित मुद्दे