gpt4 book ai didi

scheme - map和apply in scheme有什么区别?

转载 作者:行者123 更新时间:2023-12-03 15:12:35 29 4
gpt4 key购买 nike

我正在尝试学习Scheme,并且很难理解mapapply之间的区别。

据我了解,map将函数应用于列表的每个元素,而apply将某些东西应用于过程的参数。

它们可以互换使用吗?

最佳答案

他们是不一样的!他们的名字实际上可以帮助记住哪个在做什么。

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

(map - '(2 3 4))
; => (-2 -3 -4)


map称为 (- 2)(- 3)(- 4)以构建列表。

(map + '( 1  2  3)
'(10 20 30))
; => (11 22 33)


map称为 (+ 1 10) (+ 2 20) (+ 3 30)以建立列表。

(map * '(2 2 -1)
'(0 3 4)
'(5 4 2))
; => (0 24 -8)


map称为 (* 2 0 5) (* 2 3 4) (* -1 4 2)以建立列表。

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


apply将至少接受两个参数,第一个是过程,最后一个是列表。它将使用以下参数(包括列表内的参数)调用该过程:

(apply + '(2 3 4))
; => 9


(+ 2 3 4)相同

(apply display '("Hello, world!"))
; does not return a value, but prints "Hello, world!"


这与 (display "Hello, world!")相同。

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

(define arguments '(10 50 100))
(apply + arguments)


如果您尝试在不使用 apply的情况下重写最后一行,则会意识到您需要遍历列表,对每个元素求和...

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

(apply PROC a b c ... y z '(one two ... twenty))


和打电话一样

(PROC a b c ... y z  one two ... twenty)


这是一个具体的例子:

(apply + 1 -2 3 '(10 20))
; => 32


(+ 1 -2 3 10 20)相同

apply之所以具有该名称,是因为它允许您将过程“应用”到多个参数。

关于scheme - map和apply in scheme有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488723/

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