【发布时间】:2015-10-30 17:06:57
【问题描述】:
几天前我开始学习 Haskell,学习了基础知识,还有一些我无法理解的东西。
首先,
当我尝试在 GHCi 控制台中使用 ':' 运算符将某些内容添加到列表的开头时,它仅在我尝试添加单个文字而不是列表时才有效。 (5:[1,2,3,4]) 会起作用,但 ([1,2]:[3,4,5]) 不会。但是有这个功能:
replicate2 n x
| n <= 0 = []
| otherwise = x:replicate2 (n-1) x
据我了解,它是如何递归工作的,让我们调用replicate2 2 [1,2]:
它会滑过第一个守卫,因此:
= [1,2]:replicate (2-1) [1,2]
= [1,2]:[1,2]:replicate (1-1) [1,2]
-- since n is now 0 it's an edge condition and first guard returns [], so recursion ends and we get:
= [1,2]:[1,2]:[]
函数返回[[1,2],[1,2]]
我的问题:这是如何工作的? Haskell 不应该生气并吐出错误吗?当我尝试在 GHCi 中这样做时,它确实如此。
【问题讨论】:
-
(:)运算符将一项添加到列表的开头。这就是为什么1:[2,3,4]可以,但[1,2]:[3,4]不行;您正在尝试将 list 添加到前面。 -
是的,没错,我的问题是关于我提供的功能。它确实有效,我不明白为什么,因为它不应该。
-
如果您正在构建一个列表的列表,那么列表就是“一个项目”。如果这是有道理的......
-
请注意,您可以使用
1:2:[3, 4, 5],因为它具有右关联性。 -
[1,2]:[1,2]:[]在 ghci 中应该可以正常工作。
标签: list haskell recursion functional-programming where