Scheme仅使用cond,atom?,null?,map,append和foldl / foldr来展平列表

时间:2016-04-06 22:48:24

标签: list lambda functional-programming scheme racket

尝试理解方案中的高阶函数,并且我很难尝试使用这些函数展平列表。 (flatten'(a(b)(c))) - > (a b c)

    (define (flatten s)
       (cond ((null? s) '())
             (foldr (lambda(x) (if (atom? x) (append x)
                          (list x))) s '())))

(flatten'(a(b)c))返回'()

我不确定如何在这里使用地图,我该如何使用foldl?感谢

1 个答案:

答案 0 :(得分:0)

您使用cond错误。特殊形式的合同是:

(cond
  (predicate consequent1 consequent2 ...) ...)

最后一个谓词可能是符号else。看着你,这就是它的解释:

(cond ((null? s)        ; predicate 
       '())             ; consequent1 (result)
      (foldr            ; predicate (always true since only #f is false) 
       (lambda (x)       ; consequent1 (dead code)
         (if (atom? x)
             (append x)
             (list x))) 
       s                ; consequent2 (dead code)
       '())))           ; consequent3 (result)

正如您所看到的那样,它缺少围绕最后一个术语制作foldr谓词的括号。即使使用括号,它也缺少else作为谓词而没有它,fold仅用于检查它是否不是#f而不是实际结果。

由于两个术语都向()发送,而最后一个谓词始终为真(),因此始终是结果。

使用foldl您可以按相反的顺序获取元素,但速度会更快。使用foldr,你可以这样做:

(define (flatten lst)
  (let helper ((lst lst) (acc '()))
    (foldr (lambda (e acc)
             (cond ((null? e) acc)
                   ((pair? e) (helper e acc))
                   (else (cons e acc))))
           acc
           lst)))