方案 - 有人可以向我解释这个输出吗?

scheme - can someone explain this output to me?

使用这些定义的函数:

(define (foldr op z ls)
  (if (null? ls)
  z
  (op (car ls) (foldr op z (cdr ls)))))

(define (snoc x y) (cons y x))

当我 运行 这个:

(foldr snoc '() (list 1 2 3))

我得到这个输出:

=> (((() . 3) . 2) . 1)

这个输出是什么意思?有人可以向我详细解释一下吗? 我需要根据方案中的方框和指针符号来绘制这个答案。

如果 cdr 不是列表,Racket 会将 cons 单元打印为 "dotted pairs"。

来自 DrRacket 的示例:

> (list 1 2)
'(1 2)
> '(1 . (2 . ()))
'(1 2)
> '(1 . 2)
'(1 . 2)
> (cons 1 2)
'(1 . 2)
> (cons 1 '())
'(1)
> (cons '() 1)
'(() . 1)

(foldr op z ls) 采用 ls 并将 nil 替换为 z,将 cons 替换为 op

也就是说,如果ls(cons a (cons b (cons c nil))),那么(foldr op z ls)就是

(op a (op b (op c z)))

在您的示例中,(foldr snoc '() (list 1 2 3))

(snoc 1 (snoc 2 (snoc 3 '())))

从最里面向外工作 snoc,

(snoc 1 (snoc 2 (cons '() 3)))

(snoc 1 (cons (cons '() 3) 2))

(cons (cons (cons '() 3) 2) 1)

它(在 DrRacket 中)打印为点对

'(((() . 3) . 2) . 1)

(画左图作为练习。)