4

私はSchemeと関数型プログラミング全般に不慣れです。誰かがこのコードを説明できますか?具体的konsknilは何と何ですか? 目標は、リストのリストを平坦化することです。

(define (fold1 kons knil lst)  
  (if (null? lst)  
      knil  
      (fold1 kons (kons (car lst) knil) (cdr lst))))

2 つの引数に適用されている関数であることはかなり確信konsしていますが、その機能についてはまだ完全にはわかりません。

4

4 に答える 4

0

以下のコード using 'named let'and 'for'loop を使用して、それ自体がリストである可能性のある要素のリストを平坦化できます。

(define (myflatten ll)
  (define ol '())
  (let loop ((ll ll))
    (for ((i ll))
      (if (list? i)
          (loop i)
          (set! ol (cons i ol)))))
  (reverse ol))


(myflatten '(a () (b e (c)) (((d))))) 

出力:

'(a b e c d)

ただし、'set!'一般的には好まれないものを使用します。

ループは再帰'for'に置き換えることもできます:'named let'

(define (myflatten ll) 
  (define ol '())
  (let outer ((ll ll))
    (let inner ((il ll))
      (cond
        [(empty? il)]
        [(list? (first il))
         (outer (first il))
         (inner (rest il))]
        [else
         (set! ol (cons (first il) ol))
         (inner (rest il))])))
  (reverse ol))
于 2017-02-11T16:49:43.697 に答える