【问题标题】:How to recursively ask for input, and return a list如何递归地请求输入,并返回一个列表
【发布时间】:2012-12-08 17:43:16
【问题描述】:

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

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

到目前为止,我有这个:

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

但我不断收到错误。

非常感谢任何帮助!

【问题讨论】:

  • 您遇到什么类型的错误?
  • 我收到一个错误,说 ghci 无法正确打印返回值。也就是说,我想印刷不是真正的问题。非常感谢!

标签: list haskell recursion io


【解决方案1】:

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

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

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

sequence $ getinput 0 4

【讨论】:

  • 非常感谢,amindfv。再一次,我对 Haskell 的优雅程度感到震惊!
【解决方案2】:

你的代码有问题

  • 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)

一种更好更haskellish的方式

getinput2 n = sequence $ replicate n getLine

【讨论】:

  • replicateM n getLine
  • 哇,非常感谢。我一点也不知道你可以在 1 行中做到这一点!你能告诉我在这种情况下什么序列和复制吗?再次非常感谢 Satvik 和 dave4420。
  • 你的 haskellish 代码更优雅,但 OP 的代码没有错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2021-08-03
  • 1970-01-01
  • 2014-04-04
  • 2014-01-18
  • 2018-11-15
  • 2015-06-25
相关资源
最近更新 更多