用Haskell读取n行输入

Mel*_*oos 0 haskell loops input getline

我正在努力学习编写Haskell程序.我无法读取n行输入.

输入是

ñ

ab(<----- n次)

其中n,a,b是数字.

我试过了

input = []

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

main = do
 n <- getLine
 readString n
Run Code Online (Sandbox Code Playgroud)

这引发了错误.如何在Haskell中正确循环读取?

Dan*_*ner 7

Haskell是不可变的:一旦你写完

input = []
Run Code Online (Sandbox Code Playgroud)

然后input[]永远,永远,阿门.您可以使用与"变化"值相同的技术n来获得"更改"值input,即将其作为参数传递给readString:

readString 0 input = return input
readString n input = do
  z <- getLine
  readString (n-1) (z:input)
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你会发现你输入的行input从最后开始 - 所以它们以相反的顺序出现!(如果您的代码片段有效,它也会以这种方式运行.)一个简单的解决方法是更改​​基本情况:

readString 0 input = return (reverse input)
Run Code Online (Sandbox Code Playgroud)

一个更惯用的解决方法是完全废除这个论点,只是首先以正确的顺序返回事物:

readString 0 = return []
readString n = do
  z <- getLine
  zs <- readString (n-1)
  return (z:zs)
Run Code Online (Sandbox Code Playgroud)

当您对标准库感到满意时,您可能会首先毕业

readString 0 = return []
readString n = liftA2 (:) getLine (readString (n-1))
Run Code Online (Sandbox Code Playgroud)

然后跳过readString完全有利于重写的定义main:

main = do
  n <- readLn
  replicateM n getLine
Run Code Online (Sandbox Code Playgroud)