2012-03-21 15 views
5

Rozumiem, że funkcje w schemacie/rakiecie, takie jak mapa, foldr i filtr, mogą wykonywać wspaniałe rzeczy, takie jak zastosowanie funkcji do listy elementów.Stosowanie listy funkcji do numeru

Czy można zastosować listę funkcji do pojedynczego elementu?

Chciałbym wygenerować wartości produkowane przez każdą z funkcji, a następnie znaleźć ich maksimum. Dziękuję Ci.

Odpowiedz

5

W pierwszej części ta procedura zastosuje listę funkcji do pojedynczego argumentu, przy założeniu, że wszystkie funkcje otrzymują tylko jeden argument. Lista z wynikami jest zwracana

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

Dla drugiej części, znalezienie maksimum na liście jest dość proste. Na przykład, jeśli element jest 2 i lista funkcji jest (list sin cos sqr sqrt):

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

EDIT:

Oto kolejna z możliwych rozwiązań, bez użycia apply i w ramach jednej procedury:

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

Użyj tego w następujący sposób:

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

Ach dziękuję panu. To by to zrobiło. Nie nauczyłem się jednak stosować, więc będę przeprowadzał więcej badań z mojej strony. Dzięki! –

+0

Zastosowanie jest przydatne do wywoływania funkcji z listą argumentów. Na przykład (zastosuj + (lista 3 4 5)) tworzy 12. Często zdarza się, że zastosowanie może zostać zastąpione użyciem krotności; w tym przypadku foldr1 lub foldl1. Jest to przydatne w językach, które nie mają "zastosowania", ponieważ foldl1 i foldr1 są "zwykłymi" funkcjami, które można zdefiniować w dowolnym języku (no, właściwie w każdym języku). –

+0

@John Co to jest foldl1 i foldr1? Nie widzę odniesienia do nich na docs.racket-lang ... czy jest coś takiego jak zredukowanie srfi/1? –

2

Kolejny mądry sposób zastosować jedną funkcję po drugim jest rozkładana z komponować tak:

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

Awesome! Nie mogłem uzyskać własnego przy użyciu APLIKACJI do pracy, ale działa to świetnie ORAZ jest wbudowane. Dzięki! – Greg