11

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]

これどうやってするの?

4

2 に答える 2

53

replicateMから使用Control.Monad:

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

人に魚を与える/人に釣りを教えるという精神で: あなたはHoogleを検索することでこれを自分で見つけることができたでしょう.

あなたが持っている:

  • タイプの実行するアクションIO String
  • そのアクションを実行する回数 (type Int)

あなたがしたい:

  • タイプのアクションIO [String]

したがって、 Hoogle で を検索(IO String) -> Int -> (IO [String])できます。replicateMが初当たりです。

于 2012-04-23T18:22:02.093 に答える