方案中的地图和申请有什么区别?

Sar*_*rah 14 scheme

我努力学习计划,我有一个很难理解的区别mapapply.

据我所知,map将函数应用于列表的每个元素,apply并将一些内容应用于过程的参数.

它们可以互换使用吗?

Jay*_*Jay 36

他们是不一样的!他们的名字实际上有助于记住哪些做了什么.

map将把一个程序和一个或多个列表作为参数.对于列表的每个位置,将调用该过程一次,使用该位置的元素列表作为参数:

(map - '(2 3 4))
; => (-2 -3 -4)
Run Code Online (Sandbox Code Playgroud)

map(- 2),(- 3),(- 4)建立名单.

(map + '( 1  2  3)
       '(10 20 30))
; => (11 22 33)
Run Code Online (Sandbox Code Playgroud)

map打电话(+ 1 10) (+ 2 20) (+ 3 30)来建立清单.

(map * '(2 2 -1)
       '(0 3  4)
       '(5 4  2))
; => (0 24 -8)
Run Code Online (Sandbox Code Playgroud)

map打电话(* 2 0 5) (* 2 3 4) (* -1 4 2)来建立清单.

map 具有该名称,因为它在一组值(列表中)上实现了"map"(函数):

(map - '(2 3 4))
 arguments     mapping "-"     result
     2       === (- 2) ===>     -2
     3       === (- 3) ===>     -3
     4       === (- 4) ===>     -4

(map + '( 1  2  3)
       '(10 20 30))
 arguments      mapping "+"      result
    1 10     === (+ 1 10) ===>     11 
    2 20     === (+ 2 20) ===>     22
    3 30     === (+ 3 30) ===>     33
Run Code Online (Sandbox Code Playgroud)

apply至少采用两个参数,第一个是过程,最后一个是列表.它将使用以下参数调用该过程,包括列表中的参数:

(apply + '(2 3 4))
; => 9
Run Code Online (Sandbox Code Playgroud)

这是一样的 (+ 2 3 4)

(apply display '("Hello, world!"))
; does not return a value, but prints "Hello, world!"
Run Code Online (Sandbox Code Playgroud)

这是一样的(display "Hello, world!").

apply 将参数作为列表时很有用

(define arguments '(10 50 100))
(apply + arguments)
Run Code Online (Sandbox Code Playgroud)

如果你试图在不使用的情况下重写最后一行apply,你会发现你需要循环遍历每个元素的列表......

apply也可以使用超过这两个参数.第一个参数必须是可调用对象(过程或延续).最后一个必须是一个列表.其他(在第一个和最后一个之间)是任何类型的对象.所以打电话

(apply PROC a b c ... y z '(one two ... twenty))
Run Code Online (Sandbox Code Playgroud)

和打电话一样

(PROC a b c ... y z  one two ... twenty)
Run Code Online (Sandbox Code Playgroud)

这是一个具体的例子:

(apply + 1 -2 3 '(10 20))
; => 32
Run Code Online (Sandbox Code Playgroud)

这是一样的 (+ 1 -2 3 10 20)

apply 具有该名称,因为它允许您将过程"应用"到多个参数.


Wil*_*ess 5

不,apply将它的第一个参数作为过程调用,其余所有参数作为它的参数,最后一个——列表——打开,即它的内容“拼接”:

(apply f a b (list c d e)) == (f a b c d e)
Run Code Online (Sandbox Code Playgroud)

例如:

(apply + 1 2 (list 3 4 5))
;价值: 15

这只是一个电话;而map实际上是为其第二个参数的每个成员元素调用它的第一个参数。

一个组合使用map,并apply为著名的transpose伎俩:

(apply map list '((1 2 3) (10 20 30)))
;价值: ((1 10) (2 20) (3 30))