当您使用 foldr 时,您使用的过程有 2 个参数,列表的当前值和累加器。假设您迭代的列表是一个数字列表,长度相同。然后,当您遍历它们时,您希望将相同索引的数字相乘并将其存储为累加器。
如果你lambda (x acc) (map * x acc)
在里面使用foldr
,这会失败,因为acc
我相信一开始是一个空列表。你怎么能处理这样的基本情况?
当您使用 foldr 时,您使用的过程有 2 个参数,列表的当前值和累加器。假设您迭代的列表是一个数字列表,长度相同。然后,当您遍历它们时,您希望将相同索引的数字相乘并将其存储为累加器。
如果你lambda (x acc) (map * x acc)
在里面使用foldr
,这会失败,因为acc
我相信一开始是一个空列表。你怎么能处理这样的基本情况?
这可以用foldr
好吧解决,诀窍是在开始时正确初始化累加值。不需要在这里做花哨的东西(比如宏)!
(define lst '((1 2 3) (2 3 5) (3 5 7)))
(foldr (lambda (x acc) (map * x acc))
(car lst)
(cdr lst))
=> '(6 30 105)
当然,如果列表为空(car lst)
就会失败。因此,您可能希望在调用foldr
.
假设您有一个列表列表,如下所示:
((1 2 3) (2 3 5) (3 5 7))
你想把它减少到:
(6 30 105)
我会简单地做:
(define-syntax mul
(syntax-rules ()
((_ (lists ...)) (map * 'lists ...))))
您可以按如下方式使用它:
(mul ((1 2 3) (2 3 5) (3 5 7))) ; => (6 30 105)
上面的代码简单地扩展为:
(map * '(1 2 3) '(2 3 5) '(3 5 7))
然后你可以折叠结果列表。例如:
(foldr + 0 (mul ((1 2 3) (2 3 5) (3 5 7)))) ; => 141