用Haskell读取n行输入

时间:2018-11-03 11:52:14

标签: loops haskell input getline

我正在尝试学习编写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中正确循环读取?

1 个答案:

答案 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