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 uncurry 函数为 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?