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)]
在这里,我们有两个列表 x:ℕ → X 和 y:ℕ → Y,具有相同的域,并且一种类型为 f:X → (Y → Z) 的函数。为了在元组(f,x,y)上进行评估,map 必须在幕后进行更多工作。
首先,map 构造对角乘积列表 diag(x,y):ℕ → X × Y,其中 diag(x,y)(n)=(x(n),y(n))。
其次,map 对函数进行反柯里化操作 curry-1(f):X × Y → Z。最后,map 将这些操作组合起来,以获得 curry-1(f)○diag(x,y):ℕ → Z。
我的问题是:这种模式是否可以推广?也就是说,假设我们有三个列表 x:ℕ → X,y:ℕ → Y 和 z:ℕ → Z,以及一个函数 f:X →(Y →(Z → W))。map 是否将元组(f,x,y,z)发送到列表 curry-2(f)○diag(x,y,z):ℕ → W?