Scheme解包地图列表列表

时间:2016-09-16 15:48:32

标签: scheme

(map list (list 1 2 3) (list 4 5 6))
(define (interleave . args)
  (map list args))
(interleave (list 1 2 3) (list 4 5 6) (list 7 8 9))

第一个函数返回一个交错((1 4)(2 5)(3 6)) 更好的是它会在任意数量的列表上交错(我需要) 但是我的交错函数返回(((1 2 3))((4 5 6))((7 8 9)))

如何解压args列表,以便map可以映射列表中的列表?

2 个答案:

答案 0 :(得分:3)

这称为zip

(define (zip . args)
  (apply map list args))

(zip '(1 2 3) '(a b c) '(I II III))       ; ==> ((1 a I) (2 b II) (3 c III))
(apply zip '((1 a I) (2 b II) (3 c III))) ; ==> ((1 2 3) (a b c) (I II III)) 

您会在SRFI-1 List Library中找到zip,因此很多实现都可以启用它,或者您只需在导入列表中包含(srfi :1)的r6rs。

您还有unzip zip,但它需要列表而不是许多参数。它几乎与zip相反:

(define (unzip lsts)
  (apply map list lsts))

(unzip '((1 a I) (2 b II) (3 c III))) ; ==> ((1 2 3) (a b c) (I II III))
(unzip '((1 2 3) (a b c) (I II III))) ; ==> ((1 a I) (2 b II) (3 c III))

在SRFI-1中,您unzip1 ... unzip5实际上更接近于zip,因为它返回多个值:

(unzip3 '((1 a I) (2 b II) (3 c III))) ; ==> (1 2 3); (a b c); (I II III)

答案 1 :(得分:1)

您可以使用apply

(define (interleave . args)
    (apply map list args))