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