3

这是作业,所以我不想要答案。我只需要朝着正确的方向推动。我需要将多个功能映射到一个列表中。例如:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

我可以让它将第一个函数映射到列表的元素,但是,在那之后我很迷茫。此外,由于这是介绍性的,因此我仅限于介绍性功能(constappendcarcdrmember等)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
4

4 回答 4

2

您需要组合f参数中收到的函数。为简单起见,假设列表中只有两个函数 - 那么您需要将第一个函数应用于数字列表中的当前元素,然后将第二个函数应用于其结果。如果您可以使用该compose过程,请继续使用它并在您的代码中更改此行:

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

......有了这个:

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

如果你不能使用compose,那么用这一行替换同一行:

((cadr f) ((car f) (car l)))               ; now we're applying both functions

现在,如果问题更普遍,并且您需要映射具有两个以上元素的函数列表,那么再次用以下代码替换代码中的同一行:

((compose-multi f) (car l))

并实现一个辅助函数,通过连续调用来组合并返回列表中的所有函数compose。鉴于它是家庭作业,这个留给你作为练习 - 但如果你了解上面的代码如何仅用于两个函数,那么扩展多个函数列表的结果应该很容易:

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

请注意,在处理函数列表中没有元素的情况时,需要使用恒等函数;它的定义非常简单,它只返回作为参数传递的相同值。

另请注意,compose-multi返回一个函数,即组合列表中所有函数的结果 -compose为您执行此操作,但如果您不允许使用它,请记住:

(compose x y)

...相当于这个:

(lambda (n) (x (y n)))
于 2012-05-19T14:33:23.063 回答
1

把它写成两个函数可能更容易。一个是获取函数列表和单个输入,然后依次应用列表中的所有函数。一个功能应用程序的输出将成为下一个功能应用程序的输入;一旦你用完了函数,你就完成了。

另一个函数将简单地将这个辅助函数映射到输入列表中。

于 2012-05-19T14:33:56.750 回答
1

要暖和起来,从一个更简单的问题开始。然后推广解决方案。

你会怎么写这个函数?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

这需要一个fs函数值列表作为参数和一个数字,x并计算将函数(组合)fs应用于x?

于 2012-05-19T15:11:30.313 回答
1

这是另一种方法来定义multi-map哪个而不是组合使用称为的操作fold。由于您只被允许使用介绍性功能,因此这并不是您作业的真正答案。但它会是,如果你写你自己的定义fold(它不是很长!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)
于 2012-05-23T13:07:27.193 回答