mapは関数とリストを取り、その関数をリストのすべての要素に適用します。例えば、
(map f [x1 x2 x3])
;= [(f x1) (f x2) (f x3)]
数学的には、リストは自然数 ℕ の部分関数です。x : ℕ → Xが何らかのリストであり、f : X → Yが何らかの関数である場合、 map は ( f , x ) のペアをリスト f○x : ℕ → Yに取ります。したがって、少なくとも単純なケースでは、map と comp は同じ値を返します。
ただし、複数の引数を指定して map を適用すると、さらに複雑な処理が行われます。例を考えてみましょう:
(map f [x1 x2 x3] [y1 y2 y3])
;= [(f x1 y1) (f x2 y2) (f x3 y3)]
ここでは、同じ定義域を持つ 2 つのリストx : ℕ → Xとy : ℕ → Yと、型f : X → ( Y → Z ) の関数があります。タプル ( f、x、y ) を評価するために、マップは舞台裏でさらに作業を行う必要があります。
最初に、 mapは diag( x , y )(n) = ( x (n), y (n))によって定義される対角積リスト diag( x , y ) : ℕ → X × Yを作成します。
次に、関数をカリー-1 ( f ) : X × Y → Zにアンカリー化します。最後に、map はこれらの操作を組み合わせて、curry -1 (f) ○ diag( x , y ) : ℕ → Zを取得します。
私の質問は次のとおりです。このパターンは一般化されていますか? すなわち、3 つのリストx : ℕ → X、y : ℕ → Yおよびz : ℕ → Zと、関数f : X → ( Y → ( Z → W ))) があるとします。map はタプル ( f , x , y , z ) をリスト Curry -2 (f) ○ diag( x , y , z ) : ℕ → Wに送りますか?