我正在尝试学习编写Haskell程序。 我无法读取n行输入。
输入为
n
a b(<----- n次)
其中n,a,b是数字。
我尝试过
input = []
readString 0 = return()
readString n =
do
z <- getLine
z:input
readString (n-1)
main = do
n <- getLine
readString n
会引发错误。如何在Haskell中正确循环读取?
答案 0 :(得分:7)
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