【发布时间】:2020-09-10 21:51:37
【问题描述】:
如果我想在 MIT Scheme 中反转一个列表,我可以使用(fold cons '() list) 来实现,这样如果列表是(define lis '(1 2 3 4)),那么(fold cons '() lis) 会给出(4 3 2 1)。有两种折叠,左右折叠,但如果我使用(fold-right cons '() lis),我会得到(1 2 3 4),所以普通折叠不能是那种。另外,如果我使用(fold-left cons '() lis),我会得到((((() . 1) . 2) . 3) . 4),这样在原始示例中也不能折叠。反转列表需要什么样的折叠?
我问是因为我希望能够进行通用折叠:
(define ls '((1 2 3) (4 5 6)))
(gen-fold cons '() ls)
=> ((6 5 4) (3 2 1))
(define l2 '(((1 2) (2 3)) ((3 4) (4 5))))
(gen-fold cons '() ls)
=> (((5 4) (4 3)) ((3 2) (2 1)))
编辑:为了更好地呈现问题,这些图表描述了我认为在调用 '(fold cons '() '(1 2 3)) 时会发生的列表轮换,假设 fold 是修改后的 fold-left 根据 Alexis king:
【问题讨论】:
-
基础 MIT Scheme 环境不包含
fold函数,仅包含fold-left和fold-right。我能想到的唯一半内置fold来自SRFI-1。您是否包含任何会引入fold定义的内容? -
看起来它是一个内置的,因为通过全新安装 mit-scheme 我可以进入并输入
(fold cons '() '(1 2 3))并得到=> (3 2 1)而无需定义折叠 -
“反转列表需要什么样的折叠?” 左折叠 {
cons参数顺序颠倒}。
标签: scheme reduce fold mit-scheme