印刷物のReal World Haskell、第4章、98ページでは、words
折りたたみを使用して実装できるかどうかを尋ねられますが、これも私の質問です。
出来ますか?そうでない場合、なぜですか?もしそうなら、どうですか?
私は次のことを思いつきました、これは各非スペースが出力リストの最後の単語の前に追加されるべきであるという考えに基づいています(これはotherwise
ガードで発生します)、そして空白は空の単語の追加をトリガーするべきであるという考えに基づいています出力リストがまだ存在しない場合(これがで取り扱われますif
- - )。then
else
myWords :: String -> [String]
myWords = foldr step [[]]
where
step x yss@(y:ys)
| x == ' ' = if y == "" then yss else "":yss
| otherwise = (x:y):ys
入力文字列の先頭にスペースがあると、文字列の出力リストに1つの空の文字列が先行するため、このソリューションは間違いです。
上記のリンクで、私は他の読者のために提案された解決策のいくつかを調べました、そしてそれらの多くは私の解決策と同様に動作しますが、それらは一般的に、例えば、tail
もしあるならそれを空の先行文字列です。
他のアプローチはタプル(実際にはペアのみ)を使用するため、フォールドはペアを処理し、先頭/末尾のスペースを適切に処理できます。
これらすべてのアプローチfoldr
(または別のフォールド、fwiw)は、箱から出して最終的な出力を提供する関数ではありません。なんとかして出力を調整しなければならない何かが常にあります。
したがって、私は最初の質問に戻って、words
折りたたみを使用して(末尾/先頭/繰り返しのスペースを正しく処理する方法で)実際に実装できるかどうかを尋ねます。折り目を使用して、私は折りたたみ機能は、最も外側の関数でなければならないことを意味します。
myWords :: String -> [String]
myWords input = foldr step seed input