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)
我试图理解 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)