2012-03-21 7 views
5

map、foldr、およびfilterのようなScheme/Racketの関数は、要素のリストに関数を適用するような素晴らしいことを行うことができます。数字に関数リストを適用する

機能のリストを1つの要素に適用できますか?

それぞれの関数で生成された値を生成し、最大値を求めたいと思います。ありがとうございました。

答えて

5

最初の部分では、すべての関数が1つの引数のみを受け取ると仮定して、このプロシージャは1つの引数に関数のリストを適用します。結果のリストが返されます。

2番目の部分では、リスト内の最大値を見つけるだけで十分です。要素が2であり、たとえば、機能のリストは(list sin cos sqr sqrt)ある:

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

EDIT:

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

ここ別の可能な解決策はapplyを使用せずに単一の手順で、です

このように使用します。

(max-list-function (list sin cos sqr sqrt) 2) 
次々関数を適用する別の巧妙な方法がそうのような構成で折り畳むことです
+1

あああなたの先生に感謝。それはそれをするだろう。しかし、私は適用を学んでいないので、私は私の部分についてさらに研究をしています。ありがとう! –

+0

Applyは、引数のリストを持つ関数を呼び出すのに便利です。たとえば、(apply +(list 3 4 5))は12を生成します。適用はfoldの使用に置き換えることができます。この場合、foldr1またはfoldl1。 foldl1とfoldr1はどの言語でも定義できる「通常の」関数なので、これは 'apply'を持たない言語では便利です。 –

+0

@John foldl1とfoldr1とは何ですか?私はdocs.racket-langでそれらを参照することはできません... srfi/1のようなものですか? –

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

恐ろしい!私は働くために申し込みを使って自分自身を得ることができませんでしたが、これは素晴らしい作品で、それは組み込まれています。ありがとう! – Greg

関連する問題