【问题标题】:"mostly" flatten a nested list"大部分" 展平嵌套列表
【发布时间】:2019-12-17 02:56:02
【问题描述】:

我有一个嵌套的foo,其中每个元素都是一个bar,我想在不展平bars 的情况下展平foos。
例如:

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

使用球拍中的普通flatten 不起作用,因为我得到了(bar 2 bar 3 bar 4 bar 5)

foo可以任意嵌套深度。

有什么方法可以做到这一点吗?

【问题讨论】:

    标签: scheme racket flatten


    【解决方案1】:

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

    ;; An Element is a value for which element? returns true
    ;; element? : Any -> Boolean
    (define (element? v)
      ...you-have-to-determine-this...)
    

    这个element? 谓词应该回答这个问题:“什么决定了何时不应该展平子列表?”在您的情况下,这意味着以bar 开头的内容,例如(bar 2)(bar 3)

    ;; An Element is a (cons 'bar Any)
    ;; element? : Any -> Boolean
    (define (element? v)
      (and (pair? v) (equal? (car v) 'bar)))
    

    一旦定义了这个element? 谓词,您就可以基于它制作一个展平函数:

    ;; 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 是我缺少的特殊酱汁。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多