0

リストを取り、すべての「アトム」をトップレベルの要素に変換するPretty Big言語(Dr. Racket)を使用して、Schemeで関数を定義しようとしています。たとえば、次の場合:

(level '(a b (c d) (e f (g 4 h))))
;=> (a b c d e f g 4 h)

これが私がこれまでに持っているコードです:

;;level -takes list and returns list w/all elements as top-level
(define level
  (lambda (L)
    (cond ((null? L) L)
          ((not( pair? L)) L)
          (else (append (level(car L)) (level(cdr L)))))))

私のエラーは次のとおりです。

append: contract violation
  expected: list?
  given: d

このエラーのトラブルシューティングを手伝ってくれる人はいますか?

4

3 に答える 3

1

追加はリストで機能します。levelリストで呼び出すと、'(1 2 3)最初の反復で実行されます(append (level '1) (level (cdr '(2 3)))。'1 はペアではないため、リストではない1 に評価されます。(append '1 ...)契約違反である呼び出しのようなものになります。

編集

flattenこれはPretty Bigの実装です。これは、同様の質問に対するChris Jester-Young の回答に基づいています。appendバージョンよりも効率的です。

(define (flatten lst)
  ;; helper function that accumulates
  (define (reverse-flatten-into x lst)
    (if (pair? x)
        (foldl reverse-flatten-into lst x)
        (cons x lst)))

  (reverse (reverse-flatten-into lst '())))
于 2013-10-14T18:15:55.740 に答える
0

再帰関数を定義するときはいつでも、すべての句が同様の型のオブジェクトを返す必要があります。あなたの場合、3番目の節の再帰呼び出しはリストが返されることを期待していますが(で使用するためappend)、2番目の節は「アトム」を返します。したがって、コンパイラ/ランタイムは「リストが必要です」と文句を言います。

(list L)これに対する修正は、2 番目のcond句で返すことです。

于 2013-10-15T01:29:26.973 に答える