Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Clojure:map和comp有何不同?_List_Math_Map_Clojure - Fatal编程技术网

List Clojure:map和comp有何不同?

List Clojure:map和comp有何不同?,list,math,map,clojure,List,Math,Map,Clojure,获取一个函数和一个列表,并将该函数应用于列表中的每个元素。e、 g (map f [x1 x2 x3]) ;= [(f x1) (f x2) (f x3)] 从数学上讲,列表是自然数的部分函数ℕ. 如果x:ℕ → X是一些列表,f:X→ Y是某个函数,然后map将该对(f,x)带到列表f○x:ℕ → 因此,map和comp返回相同的值,至少在简单情况下是这样 然而,当我们应用带有多个参数的map时,会发生更复杂的事情。考虑这个例子: (map f [x1 x2 x3] [y1 y2 y3])

获取一个函数和一个列表,并将该函数应用于列表中的每个元素。e、 g

(map f [x1 x2 x3])
;= [(f x1) (f x2) (f x3)]
从数学上讲,列表是自然数的部分函数ℕ. 如果x:ℕ → X是一些列表,f:X→ Y是某个函数,然后map将该对(f,x)带到列表f○x:ℕ → 因此,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→ 最后,map组合这些操作以得到curry-1(f)○ 对角线(x,y):ℕ → Z


我的问题是:这种模式是否具有普遍性?也就是说,假设我们有三个列表x:ℕ → 十、 y:ℕ → Y和z:ℕ → Z、 函数f:X→ (Y)→ (Z)→ W) ))。map是否将元组(f,x,y,z)发送到列表curry-2(f)○ 对角线(x,y,z):ℕ → 我不知道它是否有用,但是:

  • Clojure不像Haskell那样有咖喱。它确实有部分函数应用,但与咖喱不同
  • Clojure的地图更像Haskell中的zipWith、zipWith3等

技术上是的,map可以被看作是这样的组合函数,尽管在实践中它引入了comp没有的一些开销


map
生成一个惰性序列,该序列将在最终读取结果时计算序列。因此,它返回的序列严格来说不是类型表达式所暗示的结果。它还增加了序列的开销,并改变了评估顺序,因为它是懒惰和分块的。

问题标题似乎与正文中实际提出的问题没有什么关系;我将尝试解决这两个问题

Clojure方面 正如
(map inc[1 2 3])
(comp inc[1 2 3])
这两个例子所证明的那样——顺便说一句,这两个例子在Clojure中都有完美的意义——Clojure函数
map
comp
即使在一个序列的情况下也会完全不同地运行
map
只是不将其序列参数视为软件意义上的可调用对象的函数,而
comp
以这种方式处理其所有参数
map
返回复合基准面,而
comp
不返回;
comp
返回的值可作为函数调用,而
map
返回的值则不可调用;等等

(其他函数式语言同样有单独的“map”和“compose”高阶函数;在Haskell中,它们是
map
(以及更通用的
fmap
)和
(.)

值得注意的是,
map
不会对其输入函数执行实际的内存内参数元组化,也不会对输入函数应用任何deschön链接/无毛刺转换

数学方面
这个模式当然可以很好地概括,但是值得记住的是,在模型的框架下,什么是什么的函数等等,取决于表现形式的选择,表现形式往往是任意的。有限序列可以很好地表示为(总)函数,其中有限序数作为域,或作为Kuratowski元组,或以您描述的方式表示,您不关心列表不一定是“无间隙”等。根据代表性选择,自然数的概念可能根本不会进入画面,表示列表的对象可能看起来像函数,也可能看起来不像函数,其codomain是列表项集合的超集等。

好吧,
map
只是从
comp
返回不同的值,当这两个值被传递到相同的参数时(假设这是一组对双方都有意义的论点,当然情况可能并非如此),所以我不知道公平地说它引入了开销,而comp却没有。@michielworker在多层seq转换管道的不同层上交错求值,在存在分块的情况下会发生变化。(
(filter odd?(map inc[1 2 3]))
->所有的递增都发生在所有的过滤之前;如果向量较长,它们将被交错。)“deschönfinking”是什么意思?你指的是与“uncurring”相同的?是的,这个名字指的是引入这个概念的Schönfinkel(不过我不知道我是否应该拼写它为“deschönfinking”)