您需要组合在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)))