foldr与Scheme中的追加关系

时间:2014-05-15 19:46:57

标签: scheme append fold

尝试弄清楚如何在Scheme中使用“append” 追加的概念我可以这样找到:

-----第1部分:理解Scheme中的追加概念-----

1)append需要两个或多个列表,并构建一个包含所有元素的新列表。

2)append要求其参数是列表,并生成一个列表,其元素是这些列表的元素。它连接它给出的列表。 (它有效地将其他列表的元素汇集到最后一个列表中以创建结果列表。)

3)它只连接顶级结构==> [Q1]它是什么意思“只连接顶级”?

4)然而 - 它并没有“展平”嵌套结构。 ==> [Q2]什么是“扁平”? (我看到许多地方“扁平化”但我还没弄明白) ==> [Q3]为什么追加不会“压扁”嵌套结构。

----------第2部分:如何在Scheme中使用append ---------------------------- ----

然后我环顾四周尝试使用“追加”,我看到了other discussion

基于其他讨论,我尝试了这个实现

 [code 1]
 (define (tst-foldr-append lst)
  (foldr 
   (lambda (element acc) (append acc (list element)))      
    lst
    '())                          
  )

它有效,但我很难理解这部分...(追加acc(列表元素)......

究竟“追加”在代码1中做了什么,对我来说,它只是翻转。 然后为什么它不能用于其他逻辑,例如 i)只需翻转或 iii).... cons(acc元素).....

[Q4]为什么它必须在代码1中“追加”?那是因为与foldr有关吗?

再次,抱歉这个长期的问题,但我认为这一切都是相关的。

2 个答案:

答案 0 :(得分:2)

Q1 / 2/3:这是什么"扁平化"事?

Scheme / Lisp / Racket使列表非常容易使用。列表易于构建且易于操作。因此,它们通常是嵌套的。所以,例如

`(a b 34)

表示三个元素的列表:两个符号和一个数字。然而,

`(a (b c) 34)

表示三个元素的列表:符号,列表和数字。

" flatten"用于指代转动的操作

`(3 ((b) c) (d (e f)))

`(3 b c d e f)

也就是说,列表中的列表是"展平"。

&#39>追加'功能不会压缩列表;它只是结合了它们。所以,例如,

(append `(3 (b c) d) `(a (9)))

会产生

`(3 (b c) d a (9))

另一种说法是:如果你申请'追加'对于长度为3的列表和长度为2的列表,结果的长度为5。

Q4 / 5:Foldl与追加无关。如果我是你,我想我会问一个关于foldl的单独问题。

最后的建议:去看看htdp.org。

答案 1 :(得分:1)

Q1:这意味着不会递归附加子列表,只会连接最顶层的元素,例如:

(append '((1) (2)) '((3) (4)))
=> '((1) (2) (3) (4))

Q2:与上一个问题相关,展平列表摆脱了子列表:

(flatten '((1) (2) (3) (4)))
=> '(1 2 3 4)

问题3:根据设计,因为append仅连接两个列表,所以对于展平嵌套结构,请使用flatten

问题4:在提出此类问题之前,请先阅读documentationappend只是一个不同的程序,不一定与foldr相关,但它们可以一起使用;它将列表与元素连接起来(如果“元素”是列表,则结果将是正确的列表)。 cons只是将两个东西粘在一起,无论它们的类型如何,append总是返回一个列表(正确或不正确)作为输出。例如,要在末尾附加一个元素,您可以执行以下操作:

(append '(1 2) '(3))
=> '(1 2 3)

但是这些表达式会给出不同的结果(在Racket中测试):

(append '(1 2) 3)
=> '(1 2 . 3)
(cons '(1 2) '(3))
=> '((1 2) 3)
(cons '(1 2) 3)
=> '((1 2) . 3)

问题5:不,cons在这里可行。如果你只是测试每个程序以查看它们是如何工作的,那么你就不会问这些。请通过阅读文档和编写小例子来了解您正在使用的内容,这是您学习如何编程的唯一方法。