3

我在 Haskell 中尝试了许多不同的方法来做到这一点,但我一生都无法弄清楚这一点。

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

到目前为止,我有这个:

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

但我不断收到错误。

非常感谢任何帮助!

4

2 回答 2

7

你的代码有问题

  • 的返回类型inputIO String所以你不能将它附加到列表中。
  • 同样的返回类型getinput (a+1) bisIO [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
于 2012-12-21T06:18:58.753 回答
2

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

只要所有元素都属于同一类型,您就可以将 an 附加到列表的开头 - 所以您最终会得到具有该类型的东西IO String[IO String]

您需要做的就是使用您编写的代码应用它sequence——例如:

sequence $ getinput 0 4
于 2012-12-22T03:17:53.593 回答