我已经在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
但我不断收到错误。
非常感谢任何帮助!
答案 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