这是家庭作业,所以我不想要答案。我只需要朝着正确的方向努力。我需要将多个函数映射到列表中。例如:
(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)
我能够将第一个函数映射到列表的元素,然而,之后我很失落。此外,由于这是介绍性的,我仅限于介绍性功能(const
,append
,car
,cdr
,member
等。)
(define (map-multi f l)
(cond
((null? l)
l)
(else (cons ((car f) (car l))
(map-multi f (cdr l))))))
答案 0 :(得分: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
请注意,处理函数列表中没有元素的情况需要identity函数;它的定义非常简单,它只返回作为参数传递的相同值。
另请注意,compose-multi
会返回函数,组成列表中所有函数的结果 - compose
会为您执行此操作,但如果您不是允许使用它只记得这个:
(compose x y)
......等同于:
(lambda (n) (x (y n)))
答案 1 :(得分:1)
将此作为两个函数编写可能更容易。一个获取函数列表和单个输入,并将列表中的所有函数串行应用。一个函数应用程序的输出将是下一个函数的输入;一旦你完成了功能,你就完成了。
另一个函数将简单地将此辅助函数映射到输入列表中。
答案 2 :(得分:1)
要变暖,请从更简单的问题开始。然后概括解决方案。
你会怎么写这个函数?
(define (map-single fs x)
...)
> (map-single (list double add1) 3)
7
它将函数值的列表fs
作为参数和数字x
,并计算将fs
中的(组合)函数应用于{{{ 1}}?
答案 3 :(得分: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)