1. ホーム
  2. scheme

[解決済み】schemeのmapとapplyの違いは何ですか?

2022-02-11 17:47:56

質問

Schemeを学ぼうとしているのですが、次のような違いがよくわかりません。 {コード と {コード .

私の理解では map はリストの各要素に関数を適用し apply は、プロシージャの引数に何かを適用します。

この2つは同じように使うことができますか?

どのように解決するのですか?

同じではない!?この2つの名前を覚えておくと便利です。

{コード は引数として1つの手続きと1つ以上のリストを取ります。 手続きはリストの各位置に対して、その位置の要素のリストを引数として一度だけ呼ばれます。

map

{{コード という apply, {コード , {コード を使ってリストを構築します。

map

{{コード という (map - '(2 3 4)) ; => (-2 -3 -4) {コード {{コード をクリックしてリストを構築してください。

map

{{コード という (- 2){コード {{コード をクリックしてリストを構築してください。

(- 3) は、(リストの)値の集合に対して「マップ」(関数)を実装しているため、このような名前になっています。

(- 4)

{{コード がかかります。 少なくとも2 引数のうち、最初の引数は手続き、最後の引数はリストです。これは、リストの中のものも含めて、次の引数で手続きを呼び出します。

(map + '( 1  2  3)
       '(10 20 30))
; => (11 22 33)

と同じです。 map

(+ 1 10)

と同じです。 (+ 2 20).

(+ 3 30) は、引数をリストで持っている場合に便利です。

(map * '(2 2 -1)
       '(0 3  4)
       '(5 4  2))
; => (0 24 -8)

を使わずに最後の行を書き直そうとした場合。 mapということは、各要素の合計を計算するために、リスト上でループする必要があることに気づくでしょう。

(* 2 0 5) は、これら2つ以上の引数で使用することもできます。最初の引数は呼び出し可能なオブジェクト(手続きまたは継続)でなければなりません。最後の引数はリストでなければなりません。その他(最初と最後の間)は、任意の型のオブジェクトです。ですから、呼び出しは

(* 2 3 4)

を呼び出すのと同じです。

(* -1 4 2)

具体的な例を挙げてみましょう。

map

と同じです。 (map - '(2 3 4)) arguments mapping "-" result 2 === (- 2) ===> -2 3 === (- 3) ===> -3 4 === (- 4) ===> -4 (map + '( 1 2 3) '(10 20 30)) arguments mapping "+" result 1 10 === (+ 1 10) ===> 11 2 20 === (+ 2 20) ===> 22 3 30 === (+ 3 30) ===> 33

apply は、複数の引数に対して手続きを「適用」することができるため、このような名前になっています。