3

これは宿題なので、答えたくありません。正しい方向へのプッシュだけが必要です。複数の関数をリストにマップする必要があります。例えば:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

最初の関数をリストの要素にマップすることはできますが、その後は非常に迷子になります。また、これは入門的なものなので、入門機能 ( constappendcarcdrmemberなど)に限定しています。

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
4

4 に答える 4

2

パラメータで受け取る関数を作成する必要があり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)))
于 2012-05-19T14:33:23.063 に答える
1

暖かくなるには、もっと簡単な問題から始めましょう。次に、ソリューションを一般化します。

この関数をどのように記述しますか?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

fsこれは、引数として関数値のリスト と数値 を取り、関数 (の構成)を?xに適用する値を計算します。fsx

于 2012-05-19T15:11:30.313 に答える
1

multi-map構成の代わりに と呼ばれる操作を使用する定義の別の方法を次に示しますfold。導入関数しか使用できないため、これは課題に対する実際の回答ではありません。しかし、独自の定義を書くと、そうなるでしょうfold(それほど長くはありません!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)
于 2012-05-23T13:07:27.193 に答える
1

これは 2 つの関数として記述した方が簡単かもしれません。関数のリストと単一の入力を取り、リスト内のすべての関数を順番に適用します。1 つの関数アプリケーションからの出力は、次のアプリケーションの入力になります。機能を使い果たしたら、完了です。

もう 1 つの関数は、このヘルパー関数を入力のリスト全体に単純にマップします。

于 2012-05-19T14:33:56.750 に答える