gpt4 book ai didi

list - Clojure:map 与 comp 有何不同?

转载 作者:行者123 更新时间:2023-12-04 19:38:13 26 4
gpt4 key购买 nike

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?

最佳答案

问题标题似乎与正文中实际提出的问题关系不大;我将尝试解决这两个问题。

Clojure 方面

正如 (map inc [1 2 3]) 之类的例子所证明的那样和 (comp inc [1 2 3]) -- 顺便说一下,这两者在 Clojure 中都很有意义 -- Clojure 函数 mapcomp即使在一个序列的情况下,操作也完全不同。 map只是不将其序列参数视为可调用对象的软件意义上的函数,而 comp以这种方式处理它的所有论点; map返回复合数据,而 comp才不是; comp 返回的值可作为函数调用,而 map的返回值不是;等等。

(其他函数式语言类似地具有单独的“映射”和“组合”高阶函数;在 Haskell 中,它们是 map(以及更通用的 fmap)和 (.)。)

值得注意的是,map不对其输入函数执行实际的内存中参数元组化,也不对输入函数应用任何 deschönfinkelizing/uncurrying 转换。

数学方面

该模式当然可以很好地概括,但值得记住的是,什么是什么等的函数——在模型的引擎盖下,就像它一样——取决于表示的选择,这往往是任意的。有限序列可以完美地表示为(总)函数,将有限序数作为域,或作为 Kuratowski 元组,或以您描述不关心列表不一定“无间隙”的方式等方式。取决于表示选择,自然数的概念可能根本没有出现,表示列表的对象可能看起来也可能不看起来像其codomain是列表条目集的超集的函数等。

关于list - Clojure:map 与 comp 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18856874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com