パラメータで受け取る関数を作成する必要がありf
ます。簡単にするために、リストに関数が 2 つしかないとしましょう。最初の関数を数値リストの現在の要素に適用し、次に 2 番目の関数をその結果に適用する必要があります。compose
手順を使用できる場合は、コード内の次の行を変更して先に進みます。
((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?
...これで:
((compose (cadr f) (car f)) (car l)) ; now we're applying both functions
を使用できない場合はcompose
、同じ行を次の行に置き換えます。
((cadr f) ((car f) (car l))) ; now we're applying both functions
ここで、問題がより一般的で、関数のリストを3 つ以上の要素にマップする必要がある場合は、コード内の同じ行を次のようにもう一度置き換えます。
((compose-multi f) (car l))
そして、リスト内のすべての関数を作成して返すヘルパー関数を、 を連続して呼び出すことによって実装しますcompose
。これは宿題なので、演習として残しておきますが、上記のコードが 2 つの関数だけでどのように機能するかを理解していれば、複数の関数のリストの結果を拡張するのは簡単です。
(define (compose-multi flist) ; procedure for composing a list of functions
(if (null? flist) ; if the list is empty then
<???> ; return the identity function
(<???> (compose-multi <???>) ; else compose the result of recursive call
<???>))) ; with the current element in the list
関数のリストに要素がない場合を処理するには、ID 関数が必要であることに注意してください。定義するのは非常に簡単です。パラメーターとして渡されたのと同じ値を返すだけです。
また、リスト内のすべての関数を構成した結果であるfunctioncompose-multi
を返すことに注意してください。これは自動的に行われますが、使用が許可されていない場合は、次のことを覚えておいてください。compose
(compose x y)
...これと同等です:
(lambda (n) (x (y n)))