方案:在元组列表上使用 apply
Scheme: Using apply on a list of tuples
如何在 Scheme 中使用 apply 将每个元组的第一个元素乘以一个数字?
例如,如果我的列表 x = ( (1 2) (3 4) )
我想做类似的事情:(apply * 2 (car x))
这样它就会 return
( (2 2) (6 4) )
.
对于 Scheme 的所有这些元素如何组合在一起,我认为您没有完全理解很多事情。
首先,"tuple"这个词有点含糊。 Scheme 没有任何正式的元组类型——它有对和列表。列表本身是由成对构建的,尽管在使用高阶函数时这通常是一个实现细节。您的列表是两个元素的列表还是对的列表?
其次,apply
不是您想要的。 apply
函数接受一个函数和一个参数列表,然后使用提供的列表作为参数调用该函数。相反,您需要 map
,它采用一个列表和一个应用于列表中每个元素的转换器函数,以及 returns 通过将函数应用于所提供列表中的所有元素而创建的列表。
最简单的方法是使用简单的 lambda 表达式。这将适用于列表和对,因为在每种情况下访问第一个元素都是相同的。
(map (lambda (x)
(cons (* 2 (car x)) (cdr x)))
'((1 2) (3 4)))
这将使用列表中的每个元素调用提供的匿名函数,函数 returns 一个新的对,其中第一个单元格是其输入值的两倍,第二个单元格保持不变。
如何在 Scheme 中使用 apply 将每个元组的第一个元素乘以一个数字?
例如,如果我的列表 x = ( (1 2) (3 4) )
我想做类似的事情:(apply * 2 (car x))
这样它就会 return
( (2 2) (6 4) )
.
对于 Scheme 的所有这些元素如何组合在一起,我认为您没有完全理解很多事情。
首先,"tuple"这个词有点含糊。 Scheme 没有任何正式的元组类型——它有对和列表。列表本身是由成对构建的,尽管在使用高阶函数时这通常是一个实现细节。您的列表是两个元素的列表还是对的列表?
其次,apply
不是您想要的。 apply
函数接受一个函数和一个参数列表,然后使用提供的列表作为参数调用该函数。相反,您需要 map
,它采用一个列表和一个应用于列表中每个元素的转换器函数,以及 returns 通过将函数应用于所提供列表中的所有元素而创建的列表。
最简单的方法是使用简单的 lambda 表达式。这将适用于列表和对,因为在每种情况下访问第一个元素都是相同的。
(map (lambda (x)
(cons (* 2 (car x)) (cdr x)))
'((1 2) (3 4)))
这将使用列表中的每个元素调用提供的匿名函数,函数 returns 一个新的对,其中第一个单元格是其输入值的两倍,第二个单元格保持不变。