2016-04-06 11 views
0

Şemadaki yüksek mertebeden fonksiyonları anlamaya çalışıyorum ve bu fonksiyonları kullanarak bir listeyi düzleştirmeye çalışıyorum. '((A (b) (c)) -> (abc)Şema sadece bir koşul kullanarak bir listeyi düzleştiriyor, atom ?, null ?, map, append ve foldl/foldr

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

(düzleştirmek düzleştirmek)') ('(a (b) c)) döndürür

ben emin değilim haritayı burada kullanmak ve nasıl katlamalı kullanarak bunu yapabilirim? Thanks

+0

Eğer 'HTDP/docs' veya diğerinden atomu ifade ediyor mu? – Majora320

+0

Teşekkürler, bu şekilde koç kullanma aptalca bir hataydı. – user3128077

cevap

0

cond kullanıyorsunuz. özel form sözleşmedir:

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

son yüklem sembolü else olabilir. Size baktığımızda bu da yorumlanır nasıl olduğunu Koşul:

(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) 

bunu foldr yüklem yapma son dönemde parantez yoksun görebileceğiniz gibi. Ayrıca, parantez içinde bile, else 'u yüklemeden ve fold olmadan sadece #f olup olmadığını kontrol etmek için kullanılacaktır.

Her iki koşul da () için geçerliliğini yitirdiği ve son yüklemenin her zaman doğru olduğu () her zaman sonuç olur.

foldl öğelerini kullanarak öğeleri ters sırada alırsınız, ancak daha hızlı olur. foldr ile bunu şöyle yapabiliriz:

(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)))