如何获得包含多个表的交叉产品?

时间:2016-10-12 16:44:30

标签: racket

我正在尝试获取两个列表之间的交叉产品。我可以看到问题在于它尝试使用(CP2 T1 T2)附加(CP2 T1 T3)。我已经想到了其他方法,例如(CP2 (CP2 T1 T2) ...),但是,省略号只会扩展为不需要的输出。

(define-syntax CP
  (syntax-rules ()
    ((CP T1 T2 ...)
     (append (CP2 T1 T2) ...)
       )
    )
  )

(define (CP2 T1 T2)
  (foldr append '() (map (λ(x)
                           (map (λ(y) (append x y)) T2))
                         T1))
  )

根本不可能这样做吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

也可以使用其中一个for循环(http://docs.racket-lang.org/reference/for.html):

(define (myproduct l1 l2)
  (for*/list ((i l1)(j l2))
    (list i j)))

(myproduct '(1 2 3) '(a b c))

输出:

'((1 a) (1 b) (1 c) (2 a) (2 b) (2 c) (3 a) (3 b) (3 c))