Scheme &引用;主要是;展平嵌套列表

Scheme &引用;主要是;展平嵌套列表,scheme,racket,flatten,Scheme,Racket,Flatten,我有一个嵌套的foo,其中每个元素都是一个bar,我想展平foos而不展平bars. 例如: (special-flatten (foo (foo (bar 2) (bar 3)) (foo (bar 4) (bar 5)))) ;=> ((bar 2) (bar 3) (bar 4) (bar 5)) 使用球拍上的正常展平不起作用,因为我得到(2杆3杆4杆5) foo可以嵌套任意深度 有没有一种快速的方法可以做到这一点?如果您有一个谓词可以确定何时不应该展平子列表,那么您可以这样做 ;

我有一个嵌套的
foo
,其中每个元素都是一个
bar
,我想展平
foo
s而不展平
bar
s.
例如:

(special-flatten (foo (foo (bar 2) (bar 3)) (foo (bar 4) (bar 5)))) ;=>
((bar 2) (bar 3) (bar 4) (bar 5))
使用球拍上的正常
展平
不起作用,因为我得到
(2杆3杆4杆5)

foo
可以嵌套任意深度


有没有一种快速的方法可以做到这一点?

如果您有一个谓词可以确定何时不应该展平子列表,那么您可以这样做

;; An Element is a value for which element? returns true
;; element? : Any -> Boolean
(define (element? v)
  ...you-have-to-determine-this...)
这个
元素?
谓词应该回答这样一个问题,“什么决定了子列表何时不应该展平?”在您的例子中,这意味着以
条开始的事情,例如
(条2)
(条3)

一旦定义了这个
元素?
谓词,就可以基于它生成一个展平函数:

;; A NestedFooListofElement is one of:
;;  - Element
;;  - (cons 'foo [Listof NestedFooListofElement])
;; foo-list? : Any -> Boolean
(define (foo-list? v)
  (and (list? v) (pair? v) (equal? (car v) 'foo)))

;; special-flatten : NestedFooListofElement -> [Listof Element]
(define (special-flatten nfle)
  (cond
    [(element? nfle)  (list nfle)]
    [(foo-list? nfle) (append-map special-flatten (rest nfle))]))
使用它:

> (special-flatten '(foo (foo (bar 2) (bar 3)) (foo (bar 4) (bar 5))))
'((bar 2) (bar 3) (bar 4) (bar 5))

append map
是我丢失的特殊酱汁。谢谢
> (special-flatten '(foo (foo (bar 2) (bar 3)) (foo (bar 4) (bar 5))))
'((bar 2) (bar 3) (bar 4) (bar 5))