Functional programming 从N个列表列表中获取一个列表,有时还获取一个列表

Functional programming 从N个列表列表中获取一个列表,有时还获取一个列表,functional-programming,scheme,Functional Programming,Scheme,我还在学习这个计划 如果您有这两个列表: '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)) 我想获得以下列表: '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4)) '(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4)) 但是使用cons: (cons '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4))) 我得到以下列表: '

我还在学习这个计划

如果您有这两个列表:

'((1 2 (3 4) 5) (12 13 4))
'((3 4 9) (7 6 5 4))
我想获得以下列表:

'((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))
'(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4))
但是使用
cons

(cons '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
我得到以下列表:

'((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))
'(((1 2 (3 4) 5) (12 13 4)) (3 4 9) (7 6 5 4))
注意

在本例中,两个列表都有两个子列表。但它们可以有n个子列表

我尝试过使用
append
,但当列表中的一个列表只是一个列表时,它不起作用:

(append '(1 2 3 4) '((23 24 25 26) (a b c)))
> '(1 2 3 4 (23 24 25 26) (a b c))

是否有一个函数可以实现它,或者我必须实现它?

您想要的行为非常具体,在标准库中找不到它。好消息是,假设输入列表不为空,以一种可移植且高效的方式实现它非常简单,可以覆盖所有可能的情况:

(define (my-append lst1 lst2)
  (cond ((and (pair? (car lst1)) (pair? (car lst2)))
         (append lst1 lst2))
        ((pair? (car lst1))
         (append lst1 (list lst2)))
        ((pair? (car lst2))
         (append (list lst1) lst2))
        (else
         (append (list lst1) (list lst2)))))
例如:

(my-append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
=> '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

(my-append '(1 2 3 4) '((23 24 25 26) (a b c)))
=> '((1 2 3 4) (23 24 25 26) (a b c))

您想要的行为非常具体,在标准库中找不到它。好消息是,假设输入列表不为空,以一种可移植且高效的方式实现它非常简单,可以覆盖所有可能的情况:

(define (my-append lst1 lst2)
  (cond ((and (pair? (car lst1)) (pair? (car lst2)))
         (append lst1 lst2))
        ((pair? (car lst1))
         (append lst1 (list lst2)))
        ((pair? (car lst2))
         (append (list lst1) lst2))
        (else
         (append (list lst1) (list lst2)))))
例如:

(my-append '((1 2 (3 4) 5) (12 13 4)) '((3 4 9) (7 6 5 4)))
=> '((1 2 (3 4) 5) (12 13 4) (3 4 9) (7 6 5 4))

(my-append '(1 2 3 4) '((23 24 25 26) (a b c)))
=> '((1 2 3 4) (23 24 25 26) (a b c))

当列表中的一个列表只是一个列表时,“
append
不起作用”是什么意思?
append
的行为不依赖于列表的元素<代码>(追加“((12(3 4)5)(12 13 4))((3 4 9)(7 6 5 4)))产生预期的
”((12(3 4)5)(12 13 4)(3 4 9)(7 6 5 4))
看看该段下面的代码。@VansFannel如果你不喜欢
”(1 2 3 4(23 24 25 26)(a b c))
,那么你应该定义你想要的内容。你的意思可能是什么“
append
在其中一个列表只是一个列表时不起作用”?
append
的行为不依赖于列表的元素。
(append'((12(3 4)5)(12 13 4))((3 4 9)(7 6 5 4))
产生预期的
((1 2(3 4)5)(12 13 4)(3 4)(7 6 5 4))
看看那一段下面的代码。@VansFannel如果你不喜欢
”(12342526)(abc))
,那么你应该定义你想要什么。可能重复
(我的附加((12)34)((23242526)(abc))
?只是猜测,但既然
((12)34)呢
不符合列表的条件,OP可能希望获得
((1 2)3 4)(23 24 25 26)(a b c))
但不
((1 2)3 4(23 24 25 26)(a b c))
。那么OP应该真的,真的发布一系列他想要的测试,停止让人们猜测他每次都需要什么复杂的功能;)是的,OP很烦人。那
(我的附加词((12)34)((23242526)(abc))
?只是猜测,但既然
((12)34)呢
不符合列表的条件,OP可能希望获得
((1 2)3 4)(23 24 25 26)(a b c))
但不
((1 2)3 4(23 24 25 26)(a b c))
。好吧,那么OP应该真的,真的发布一系列他想要的测试,不要让人们每次都猜他需要什么复杂的功能;)是的,OP很烦人。