5

在 Scheme 中,该函数(map fn list0 [list1 .. listN])具有列表必须具有相同数量的元素的限制。来自 Python,我错过了 Python 列表推导的自由,它看起来很像map上面,但没有这个限制。

我很想实现一个替代的“my-map”,它允许不同大小的列表,遍历所有列表的前 N ​​个元素,其中 N 是最短列表的长度。

例如,让numbe10lstbe (1 2 3)。使用 my-map,我希望编写如下表达式:

(my-map + (circular-list num) lst)))

并得到:

(11 12 13)

我比传统的更容易阅读

(map + (lambda (arg) (+ num arg)) lst)

或者

(map + (make-list (length lst) num) lst) 

两个问题:

  • 作为一个 Scheme 新手,我是否忽略了限制 `map` 的重要原因?
  • 类似 `my-map` 的东西是否已经存在于 Scheme 或 SRFI 中?我确实看过 srfi-42,但要么它不是我要找的东西,要么就是它,但并不明显。
4

1 回答 1

7

首先,请注意map 确实允许空列表,但当然如果有一个空列表,那么它们都应该是空的。

其次,看一下srfi-1版本map——它与R5RS版本的具体区别如下:

此过程从其 R5RS 规范扩展,以允许参数长度不等;它在最短的列表用完时终止。

第三,大多数 Scheme 程序员都非常喜欢

(map (lambda (arg) (+ num arg)) lst)

我的猜测是,Scheme 与 Python 的不同之处在于,lambda当你习惯了这种语言时,表达式变得越来越可读。

最后,有一些实现带有某种形式的列表理解。例如,在Racket中,您可以编写:

(for/list ([arg lst]) (+ num arg))
于 2011-05-21T04:33:27.580 回答