Читайте n строк ввода с помощью Haskell - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь научиться писать программы на Haskell. Я не могу прочитать n строк ввода.

Ввод

п

a b (<----- n раз) </p>

, где n, a, b - числа.

Я пытался

input = []

readString 0 = return()
readString n =
 do
  z <- getLine
  z:input
  readString (n-1)

main = do
 n <- getLine
 readString n

который выдает ошибки. Как правильно зациклить чтение в Haskell?

1 Ответ

0 голосов
/ 03 ноября 2018

Haskell неизменен: как только вы напишите

input = []

тогда input - это [] навсегда, аминь. Вы можете использовать ту же технику, которую использовали для «изменяющегося» значения n, чтобы иметь «изменяющееся» значение input, то есть передавать его в качестве аргумента readString:

readString 0 input = return input
readString n input = do
  z <- getLine
  readString (n-1) (z:input)

Если вы сделаете это, вы обнаружите, что введенные вами строки помещаются в input, начиная с конца - так что они выходят в обратном порядке! (Если бы ваш фрагмент кода работал, он бы тоже так себя вел.) Одним из простых исправлений было бы изменение базового варианта:

readString 0 input = return (reverse input)

Более идиоматическим решением было бы полностью покончить с аргументом, просто вернув сначала все в правильном порядке:

readString 0 = return []
readString n = do
  z <- getLine
  zs <- readString (n-1)
  return (z:zs)

Когда вы освоитесь со стандартной библиотекой, вы можете сначала перейти к

readString 0 = return []
readString n = liftA2 (:) getLine (readString (n-1))

и затем пропустить определение readString полностью в пользу переписывания main:

main = do
  n <- readLn
  replicateM n getLine
...