将函数列表映射到列表

时间:2012-05-19 14:14:09

标签: scheme map-function

这是家庭作业,所以我不想要答案。我只需要朝着正确的方向努力。我需要将多个函数映射到列表中。例如:

(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 个答案:

答案 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)