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

时间:2012-12-21 06:10:53

标签: list haskell recursion io

我已经在Haskell尝试了很多不同的方法来做这件事,我不能为我的生活做出这样的决定。

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

到目前为止,我有这个:

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

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

但我不断收到错误。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

代码问题

  • input的返回类型为IO String,因此您无法将其附加到列表中。
  • 同样,getinput (a+1) b的返回类型为IO [String],而不只是[String]

我已更正您的代码

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

更好更好的方式

getinput2 n = sequence $ replicate n getLine

答案 1 :(得分:2)

Satvik有一个很好的答案,但你的代码也是100%正确的。

可以IO String附加到列表的开头,只要所有元素属于同一类型 - 这样您最终会得到{{1}类型的内容1}}

您需要做的就是使用您编写的代码,将其应用于[IO String] - 例如:

sequence