Haskell 通过递归向列表添加元素

Haskell adding an element to a list via recursion

我试图理解 Haskell 中的列表,但遇到了一些我不确定的事情。是否可以遍历一个循环并在每次迭代中向列表中添加一个项目?为了这个问题的目的,我写了以下代码:

list = []
addNumbers 0 = return ()
addNumbers n =
 do
    print n
    n : list
    addNumbers (n-1)

我认为这会起作用,但它似乎给出了错误 "Couldn't match type ‘[]’ with ‘IO’"。我不太确定为什么会出现此错误,因为没有要求用户输入或输出。我认为这可能与 "print n" 有关,但没有那条线它似乎不起作用。

提前为任何帮助干杯

这不会像你想象的那样,在 Haskell 中一切都是不可变的(一旦它被赋予一个值,该值就不能改变)。您可能想要做的是:

addNumbers :: Int -> IO [Int]
addNumbers 0 = return []
addNumbers n = do print n
                  ns <- addNumbers (n-1)
                  return (n:ns)

然后在解释器中你会得到

ghci> addNumbers 3
3
2
1
[3, 2, 1]
ghci>

注意 addNumbers 的签名,它接受 Int 和 returns 由 IO monad 封装的 Int 列表。它必须由 IO monad 封装,因为在 IO monad 中调用 print returns () ,否则将不会打印该值。

如果您只想将 Int 的列表添加到列表中,那么您可以轻松地做到

foo 0 = [0]
foo n = n:foo (n-1)