如何递归地请求输入,并返回一个列表

ade*_*aek 3 io recursion haskell list

在Haskell中我一直在尝试许多不同的方法来做这件事,我不能为我的生活弄清楚这一点.

我想从用户那里得到一个名单,如果我知道列表的长度(让我们假设是n),我想提示用户n次并在第i次询问第i项.

到目前为止,我有这个:

getinput a b
| a == b = []
| otherwise = input:getinput (a+1) b
where input = do
  a <- getLine
  return a
Run Code Online (Sandbox Code Playgroud)

但我一直都有错误.

非常感谢任何帮助!

Sat*_*vik 7

你的代码有问题

  • 返回类型inputIO String因为您无法将其附加到列表中.
  • 类似地,返回类型getinput (a+1) bIO [String],而不仅仅是[String].

我在这里更正了你的代码

getinput a b | a == b = return []
             | otherwise = do
                    i <- getLine
                    rest <- getinput (a+1) b
                    return (i:rest)
Run Code Online (Sandbox Code Playgroud)

一个更好,更美观的方式

getinput2 n = sequence $ replicate n getLine
Run Code Online (Sandbox Code Playgroud)

  • 或者`replicateM n getLine`. (3认同)