方案:在元组列表上使用apply

时间:2015-03-16 04:56:44

标签: scheme apply

如何在Scheme中使用apply将每个元组的第一个元素乘以数字?

示例,如果我的列表x = ( (1 2) (3 4) )

我想做一些类似的事情:(apply * 2 (car x))以便它会返回 ( (2 2) (6 4) )

1 个答案:

答案 0 :(得分:3)

有许多事情我不认为你完全理解这些Scheme的所有元素是如何组合在一起的。

首先,术语" tuple"有点暧昧。 Scheme没有任何正式的元组类型 - 它有对和列表。列表本身是由对构建的,但在处理高阶函数时通常是实现细节。您的列表是两个元素的列表列表还是一对列表?

其次,apply不是你想要的。 apply函数接受一个函数和一个参数列表,然后使用提供的列表作为参数调用该函数。相反,您需要map,它采用列表和变换器函数应用于列表中的每个元素,并返回通过将函数应用于提供列表中的所有元素而创建的列表。

最简单的方法是使用简单的lambda表达式。这对列表和对都有效,因为在每种情况下访问第一个元素都是相同的。

(map (lambda (x)
       (cons (* 2 (car x)) (cdr x)))
     '((1 2) (3 4)))

这将使用列表中的每个元素调用提供的匿名函数,并且该函数返回一个新对,其第一个单元格是其输入值的两倍,第二个单元格未更改。