方案 - 有人可以向我解释这个输出吗?
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)
(画左图作为练习。)
使用这些定义的函数:
(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)
(画左图作为练习。)