2016-12-04 10 views
2

与えられたストリームから余分なスペースをすべて再帰的に削除する関数を実装しようとしています。どんな連続したスペースも削除しなければなりません。私はこれを正しく実装する方法を理解できません。ラケットスキーム - ストリームから重複した連続する文字を削除する

ストリームをリストに変換してそのように操作しようとしましたが、各ストリームのテストで提供される内容に基づいて、新しいストリームを作成して返す方法がわかりません。ここでは(新しいストリームを構築し、要素を削除)

を私はストリームマップを使用しようとしましたが、このような状況で私のために動作するようには思えないのremove-余分なスペースの私の現在の壊れた実装です:

(define remove-extra-spaces 
    (lambda (str) 
    (cond (not (not-more-than-one-space str 0) (stream-append (stream-first str) (remove-extra-spaces (stream-rest str)))) 
      (else (remove-extra-spaces (stream-rest str))) 
     ))) 


    (define not-more-than-one-space 
    (lambda (str count) 
     (cond ((stream-empty? str) #T) 
      ((equal? (stream-first str) #\space) (not-more-than-one-space (stream-rest str) (+ count 1))) 
      ((> count 1) #F) 
      (else #T) 
      ) 
    )) 

複数の連続したスペースがある場合に役立つテストを書いています。しかし、私はこのテストを使って、それを通過するものに基づいて新しいストリームを作成する方法を理解できません。私がstream-mapと組み合わせて使用​​しようとしたときに、ストリームフィルタが動作しませんでした。

答えて

1

stream-consの使い方を知っていますか?これはおそらくこれを実装する最も簡単な方法です。ここでは(私はそれをよりよく知っているので、代わりにracket/streamSRFI 41ストリームライブラリを使用しています)私の実装です:

(require srfi/41) 
(define-stream (collapse-spaces strm) 
    (stream-let loop ((was-space #f) 
        (strm strm)) 
    (cond ((stream-null? strm) strm) 
      ((char=? (stream-car strm) #\space) 
      (if was-space 
       (loop #t (stream-cdr strm)) 
       (stream-cons #\space (loop #t (stream-cdr strm))))) 
      (else (stream-cons (stream-car strm) 
          (loop #f (stream-cdr strm))))))) 

サンプル実行:

> (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r))) 
(#\f #\o #\o #\space #\b #\a #\r) 
+0

ありがとうございました。私はstream-consを使って調べます。私はそれを私のremove-extra-spaces関数に適用しましたが、リストに再度変換しようとするとエラーがスローされます。私はstream-appendをstream-consと置き換えました。エラーは次のとおりです。 ストリーム-最初:予想される契約違反 :(?および/ Cストリーム(ない/ Cストリーム-空)?) 与えられた:#

+0

は、私は多分letrecと、内側の再帰のいくつかの並べ替えを追求すべき、代わりにこの作業を行うには?私は自分の実装を理解しようとしているので、自分でもそれをやり遂げることができます。 –

+0

ストリームではなくリストで動作するバージョンを作成してみてください。つまり、関数はリストを消費し、空白を含むリストを生成する必要があります。それをうまく書くことができれば、ストリームのバージョンは簡単に変換できます。 –

関連する問題