Scheme 在列表列表中的子列表的开头插入元素

Scheme 在列表列表中的子列表的开头插入元素,scheme,lisp,racket,Scheme,Lisp,Racket,我的作业有点麻烦。我必须创建一个过程,请求列表和元素的列表,并继续将元素添加到每个子列表的第一个位置。我成功地做到了这一点,看起来是这样的: (define (add-element lst elem) (foldr cons lst (list elem))) (define (insert-first lst1 x) (cond [(empty? lst1) empty] [else (local [(define insert (add-element(first

我的作业有点麻烦。我必须创建一个过程,请求列表和元素的列表,并继续将元素添加到每个子列表的第一个位置。我成功地做到了这一点,看起来是这样的:

(define (add-element lst elem)
   (foldr cons lst (list elem)))

(define (insert-first lst1 x)
  (cond
   [(empty? lst1) empty]
   [else (local [(define insert (add-element(first lst1) x))]
        (cons insert (insert-first (rest lst1) x)))]))
因此,如果您要键入
(首先插入“((a b)(c d))
,您将得到
(列表(列表“x”a“b)(列表“x”c“d))

唯一的问题是,我需要使用
map
local
对过程进行编码。我认为后者我已经完成了,但我一辈子都找不到使用
map
的方法

(define (insert-first elt lst)
  (map (lambda (x)
         (cons elt x))
       lst))
然后

然后

接近您的解决方案,但map比fold更自然地适用于该问题,因为您希望对列表中的每个元素执行某些操作。当您希望通过对该列表的元素连续应用函数来累积值时,请使用fold

接近您的解决方案,但map比fold更自然地适用于该问题,因为您希望对列表中的每个元素执行某些操作。当您希望通过对该列表的元素连续应用函数来累积值时,请使用fold。

某种递归模式

(foldr g init [a,b,c,...,z]) 
= (g a (foldr g init [b,c,...,z]))
....
= (g a (g b (g c ... (g z init) ...)))
如果我们手动展开
foldr
调用您的
add元素
函数定义,我们得到

  (add-element lst elem)
  = (foldr cons lst (list elem)) 
  = (cons elem (foldr cons lst '()))
  = (cons elem lst)
然后,查看您的
insert first
函数,我们发现它也遵循
foldr
递归模式

(insert-first lst1 x) 
= (foldr (lambda(a r)(cons (add-element a x) r)) empty lst1) 
= (foldr (lambda(a r)(cons (cons x a) r)) empty lst1)
但是
(foldr(lambda(ar)(cons(ga)r))empty lst)==(map g lst)
,因为将子项与
cons
组合就是构建一个列表,这就是
map
的作用;因此我们得到

(insert-first lst1 x) = (map (lambda(a)(cons x a)) lst1)
这样我们就可以写作了

(define (insert-first lst1 x)
  (local [(define (prepend-x a) (cons ... ...))]
    (map ... ...)))
某种递归模式

(foldr g init [a,b,c,...,z]) 
= (g a (foldr g init [b,c,...,z]))
....
= (g a (g b (g c ... (g z init) ...)))
如果我们手动展开
foldr
调用您的
add元素
函数定义,我们得到

  (add-element lst elem)
  = (foldr cons lst (list elem)) 
  = (cons elem (foldr cons lst '()))
  = (cons elem lst)
然后,查看您的
insert first
函数,我们发现它也遵循
foldr
递归模式

(insert-first lst1 x) 
= (foldr (lambda(a r)(cons (add-element a x) r)) empty lst1) 
= (foldr (lambda(a r)(cons (cons x a) r)) empty lst1)
但是
(foldr(lambda(ar)(cons(ga)r))empty lst)==(map g lst)
,因为将子项与
cons
组合就是构建一个列表,这就是
map
的作用;因此我们得到

(insert-first lst1 x) = (map (lambda(a)(cons x a)) lst1)
这样我们就可以写作了

(define (insert-first lst1 x)
  (local [(define (prepend-x a) (cons ... ...))]
    (map ... ...)))

你在这个问题上有什么进展吗?你在这个问题上有什么进展吗?