我正在使用R5RS(球拍)。这是我的例子
(map (lambda (x) (list (apply + x) (apply * x))) '((1 2 3) (4 5 6)))
-> ((6 6) (15 120))
我只是想知道如果有像这样的内置函数
(map-apply '(+ *) '((1 2 3) (4 5 6)))
可以产生相同的结果。
答案 0 :(得分:6)
没有任何内置内容,但您可以编写自己的内容:
(define (map-apply funcs items)
(map (lambda (item)
(map (lambda (func)
(apply func item))
funcs))
items))
但是,您必须传递(list + *)
,而不是'(+ *)
。
答案 1 :(得分:0)
如果你经常做这些事情,你可以抽象地图功能的制作。因此其余部分将保持不变:
;; Makes a function that applies all functions to an argument
(define (make-map-fun . funs)
(lambda (lis)
(map (lambda (fun) (apply fun lis)) funs)))
(map (make-map-fun + *) '((1 2 3) (4 5 6)))
; ==> ((6 6) (15 120))
;; And you can zip with it too
(apply map
(lambda l ((make-map-fun + *) l))
'((1 2 3) (4 5 6) (7 8 9)))
; ==> ((12 28) (15 80) (18 162))
答案 2 :(得分:0)
你还在那里+火枪吗?如果你真的,真的需要将函数参数传递为'(+ *)那么你的解决方案将是:
(define (map-apply function-names items)
(let ((funcs (map (lambda (name) (eval name (interaction-environment))) function-names)))
(map (lambda (item)
(map (lambda (func)
(apply func item))
funcs))
items)))