与えられたストリームから余分なスペースをすべて再帰的に削除する関数を実装しようとしています。どんな連続したスペースも削除しなければなりません。私はこれを正しく実装する方法を理解できません。ラケットスキーム - ストリームから重複した連続する文字を削除する
ストリームをリストに変換してそのように操作しようとしましたが、各ストリームのテストで提供される内容に基づいて、新しいストリームを作成して返す方法がわかりません。ここでは(新しいストリームを構築し、要素を削除)
を私はストリームマップを使用しようとしましたが、このような状況で私のために動作するようには思えないの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と組み合わせて使用しようとしたときに、ストリームフィルタが動作しませんでした。
ありがとうございました。私はstream-consを使って調べます。私はそれを私のremove-extra-spaces関数に適用しましたが、リストに再度変換しようとするとエラーがスローされます。私はstream-appendをstream-consと置き換えました。エラーは次のとおりです。 ストリーム-最初:予想される契約違反 :(?および/ Cストリーム(ない/ Cストリーム-空)?) 与えられた:# –
は、私は多分letrecと、内側の再帰のいくつかの並べ替えを追求すべき、代わりにこの作業を行うには?私は自分の実装を理解しようとしているので、自分でもそれをやり遂げることができます。 –
ストリームではなくリストで動作するバージョンを作成してみてください。つまり、関数はリストを消費し、空白を含むリストを生成する必要があります。それをうまく書くことができれば、ストリームのバージョンは簡単に変換できます。 –