Tom*_*tta 4 math list clojure map
map采用函数和列表,并将函数应用于列表的每个元素.例如,
(map f [x1 x2 x3])
;= [(f x1) (f x2) (f x3)]
Run Code Online (Sandbox Code Playgroud)
在数学上,列表是自然数ℕ的部分函数.如果x:ℕ→ X是某个列表,并且f:X → Y是某个函数,则map将对(f,x)带到列表f○x:ℕ→ Y.因此,map和comp返回相同的值,至少在简单的情况下.
但是,当我们应用具有多个参数的地图时,会发生更复杂的事情.考虑这个例子:
(map f [x1 x2 x3] [y1 y2 y3])
;= [(f x1 y1) (f x2 y2) (f x3 y3)]
Run Code Online (Sandbox Code Playgroud)
这里,我们有两个列表x:ℕ→ X和y:具有相同域的ℕ→ Y,以及类型f的函数:X →(Y → Z).为了评估元组(f,x,y),地图必须在幕后做更多的工作.
首先,map构造对角线乘积列表diag(x,y):ℕ→ X × Y,由diag(x,y)(n)=(x(n),y(n))定义.
其次,地图不能发挥功能,以便咖喱-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?
似乎问题标题与身体中实际提出的问题没什么关系; 我会尝试解决这两个问题.
就证明了像实例(map inc [1 2 3])和(comp inc [1 2 3])-这两者,顺便说一句,可以完美地用Clojure - Clojure的功能map,并comp在一个序列的情况下,即使操作完全不同.map根本不会将其序列参数视为软件意义上的可调用对象中的函数,而是comp以这种方式处理其所有参数; map返回复合数据,而comp不是; 返回的值comp可以作为函数调用,而map's的返回值不是; 等等
(其他函数语言同样具有单独的"map"和"compose"高阶函数;在Haskell中,这些是map(并且更通用fmap)和(.).)
值得注意的是,map不对输入函数执行任何实际的内存中的参数化,也不会对输入函数应用任何deschönfinkelizing/ uncurrying转换.
这种模式当然可以概括为一般,但值得记住的是,什么是什么等等的功能 - 在模型的引擎盖下,取决于表示的选择往往是任意的.有限序列可以很好地表示为(全部)函数,有限的序数作为域,或者作为Kuratowski元组,或者你描述的方式,你不关心你的列表不一定是"无间隙"等等.取决于表示选择,自然数的概念可能根本不进入图片,表示列表的对象可能看起来像或者看起来不像其codomain是列表条目集的超集等的函数.