私はちょうど(Scheme言語を使って)関数型プログラミングの学習を始めました。高次関数は、引数として別の関数を取り込む関数か、別の関数またはその両方を返す関数です。だから私は、高階関数に以下のコードを変換しようとしています:高次関数解明
;; define two procedures - one for calculating square & one for finding double of a number
(define (square x) (* x x))
(define (double x) (+ x x))
(square 5)
=> 25
(double 5)
=> 10
は今、私は、以下の1思い付いた:
;; Implementation 2:
(define (applyToItself f x) (f x x))
(define (square x) (applyToItself * x))
(define (double x) (applyToItself + x))
(square 5)
=> 25
(double 5)
=> 10
私は、関数をとる関数applyToItself
と値を作成しました入ってくる関数を入力値に適用することによって計算された値を返します。 squareとdouble関数は、*と+を使用してapplyToItself
を使用します。
;;Implementation 3:
(define (applyToItself f) (lambda(x) (f x x)))
(define square (applyToItself *))
(define double (applyToItself +))
(square 5)
=> 25
(double 5)
=> 10
このapplyToItself
実装は今だけの機能を取り込んで、他の関数ではなく、計算された値を返します。
私の質問は以下のとおりです。
- 実装2と実施3との間の有意な差や長所と短所がありますか?
- は、の にあります。実装2と実装3の両方が高次関数ですか?
- どちらが正しいまたはより良い実装ですか?
感謝を使用して、リストのすべての要素を二乗。 Btw、あなたの最初のポイントで話している未使用の変数 'x'ですか? – VigneshBala
@VigneshBala実際は 'f'です。例えば。'(as(* aa))(bs(* bb)))(sqrt(+ as bs)))' 'と' fsのように結果が返されたときに 'bs'は存在しません'変数がスコープから外れた後に使用されます。パパルのようないくつかの言語は、自由変数がもはやスタックに存在しない場合、下向きのfunarg(より深く使われる引数として関数を渡しますが、上向きには使用しません)をサポートしています。それは[funarg問題](https://en.wikipedia.org/wiki/Downward_funarg)と呼ばれています。 – Sylwester