代码之家  ›  专栏  ›  技术社区  ›  kaiya

用Haskell读取n行输入

  •  0
  • kaiya  · 技术社区  · 7 年前

    我正在努力学习写Haskell程序。

    输入为

    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
    

    1 回复  |  直到 7 年前
        1
  •  7
  •   Daniel Wagner    7 年前

    哈斯克尔是不变的:一旦你写了

    input = []
    

    input [] n 有“变化”的价值 ,即将其作为参数传递给 readString

    readString 0 input = return input
    readString n input = do
      z <- getLine
      readString (n-1) (z: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))
    

    然后跳过 读取字符串 完全赞成重写 main :

    main = do
      n <- readLn
      replicateM n getLine