如何在Scheme中使用apply将每个元组的第一个元素乘以数字?
示例,如果我的列表x = ( (1 2) (3 4) )
我想做一些类似的事情:(apply * 2 (car x))
以便它会返回
( (2 2) (6 4) )
。
答案 0 :(得分:3)
有许多事情我不认为你完全理解这些Scheme的所有元素是如何组合在一起的。
首先,术语" tuple"有点暧昧。 Scheme没有任何正式的元组类型 - 它有对和列表。列表本身是由对构建的,但在处理高阶函数时通常是实现细节。您的列表是两个元素的列表列表还是一对列表?
其次,apply
不是你想要的。 apply
函数接受一个函数和一个参数列表,然后使用提供的列表作为参数调用该函数。相反,您需要map
,它采用列表和变换器函数应用于列表中的每个元素,并返回通过将函数应用于提供列表中的所有元素而创建的列表。
最简单的方法是使用简单的lambda表达式。这对列表和对都有效,因为在每种情况下访问第一个元素都是相同的。
(map (lambda (x)
(cons (* 2 (car x)) (cdr x)))
'((1 2) (3 4)))
这将使用列表中的每个元素调用提供的匿名函数,并且该函数返回一个新对,其第一个单元格是其输入值的两倍,第二个单元格未更改。