2012-03-21 126 views
5

我知道Scheme/Racket中的函數(如map,foldr和filter)可以完成諸如將函數應用於元素列表等美妙事物。將函數列表應用於數字

是否可以將函數列表應用於單個元素?

我想生成每個函數產生的值,然後找到它們的最大值。謝謝。

回答

5

對於第一部分,此過程將把函數列表應用於單個參數,假定所有函數只接收一個參數。返回結果列表

(define (apply-function-list flist element) 
    (map (lambda (f) 
     (f element)) 
     flist)) 

對於第二部分,查找列表中的最大值足夠簡單。例如,如果元件是2和的函數的列表是(list sin cos sqr sqrt)

(apply max 
(apply-function-list (list sin cos sqr sqrt) 2)) 

編輯:

下面是另一個可能的解決方案,而不使用apply,並在單個步驟:

(define (max-list-function flist element) 
    (foldr max -inf.0 
     (map (lambda (f) (f element)) 
       flist))) 

如下使用:

(max-list-function (list sin cos sqr sqrt) 2) 
+1

啊謝謝主席先生。這將做到這一點。儘管我還沒有學會適用,所以我會做更多的研究。謝謝! – 2012-03-21 03:21:55

+0

應用對於使用參數列表調用函數很有用。因此,例如(apply +(list 3 4 5))產生了12.通常情況下,可以使用fold來替換apply;在這種情況下,foldr1或foldl1。這在沒有「應用」的語言中很有用,因爲foldl1和foldr1是可以用任何語言(幾乎任何語言)定義的「常規」函數。 – 2012-03-21 04:44:32

+0

@John什麼是foldl1和foldr1?我沒有在docs.racket-lang上看到對它們的引用...是否像srfi/1的reduce? – 2012-03-21 17:07:18

2

另一種聰明的方式,將一個功能陸續將與摺疊構成,像這樣:

(define functions (list add1 abs list)) 
((foldl compose1 values functions) -5) 
;which reduces to (list (abs (add1 (values -5)))) 
;which reduces to '(4) 
+0

太棒了!我無法使用APPLY工作,但這個工程很好,它的內置。謝謝! – Greg 2012-11-04 04:41:32