3

私は Haskell でこれを行うためにさまざまな方法を試してきましたが、私の人生ではこれを理解することはできません。

ユーザーから名前のリストを取得したいのですが、リストの長さがわかっている場合 (n と仮定します)、ユーザーに n 回プロンプトを表示し、i 番目のアイテムを i 番目の時間に要求したいと考えています。 .

これまでのところ、私はこれを持っています:

getinput a b
| a == b = []
| otherwise = input:getinput (a+1) b
where input = do
  a <- getLine
  return a

しかし、エラーが発生し続けます。

どんな助けにも強く感謝します!

4

2 に答える 2

7

コードの問題

  • の戻り値の型はinputisであるIO Stringため、リストに追加することはできません。
  • 同様に、 の戻り値の型はgetinput (a+1) bisIO [String]であり、 だけではありません[String]

ここで私はあなたのコードを修正しました

getinput a b | a == b = return []
             | otherwise = do
                    i <- getLine
                    rest <- getinput (a+1) b
                    return (i:rest)

より良い、よりハスケル的な方法

getinput2 n = sequence $ replicate n getLine
于 2012-12-21T06:18:58.753 に答える
2

Satvik には良い答えがありましたが、あなたのコードも 100% 正しいです。

すべての要素が同じ型である限り、リストの先頭にan を追加できます。つまり、型を持つものになります。IO String[IO String]

作成したコードを使用して、次のように適用するだけですsequence

sequence $ getinput 0 4
于 2012-12-22T03:17:53.593 に答える