2013-06-21 26 views

回答

6

沒有內置,但你可以寫自己:

(define (map-apply funcs items) 
    (map (lambda (item) 
     (map (lambda (func) 
       (apply func item)) 
       funcs)) 
     items)) 

你不得不在(list + *)通過,不'(+ *),但是。

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)) 
+1

有沒有必要爲宏; ('(define(make-map-fun。funcs))(lambda(args)(map(lambda(func)(apply func))可以編寫一個純函數的'make-map-fun'實現, args))funcs)))')。因此,「如果必要時只使用宏」等常見建議:-) –

+0

@ ChrisJester-Young你是完全正確的。 – Sylwester

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))) 
+1

Ewwww。 'eval',真的?!但是,嚴重的是,傳入函數名稱符號而不是函數對象只是真的被破壞了。 –

+0

我以'如果你真的,真的需要...'開頭,表明我的懷疑,但這是他在OP中展示的內容。可能會實施翻譯或閱讀輸入。 – GoZoner

相關問題