Real World Haskell, bölüm 4, sayfa 98,words
kıvrımlar kullanılarak uygulanıp uygulanamayacağını soruyor ve bu da benim sorum:
Mümkün mü? Değilse, neden? Eğer öyleyse, nasıl?
Ben her boşluk olmayan çıktı listesindeki son sözcüğe (bu otherwise
nöbetçi olur ) başlaması gerektiğini ve bir boşluk emtpy kelimesinin eklenmesini tetiklemek gerekir fikrine dayanan aşağıdaki ile geldi zaten bir tane yoksa çıkış listesi (bu if
- then
- içinde ele alınır else
).
myWords :: String -> [String]
myWords = foldr step [[]]
where
step x yss@(y:ys)
| x == ' ' = if y == "" then yss else "":yss
| otherwise = (x:y):ys
Açıkça bu çözüm yanlıştır, çünkü giriş dizesindeki önde gelen boşluklar, dizelerin çıktı listesinde bir önde gelen boş dizeyle sonuçlanır.
Yukarıdaki bağlantıda, diğer okuyucular için önerilen çözümlerin birkaçına baktım ve birçoğu benim çözümümle benzer şekilde çalışıyor, ancak genellikle katlamanın çıktısını "post-process", örneğin tail
eğer varsa boş, önde gelen bir dizedir.
Diğer yaklaşımlarda tuples (aslında sadece çiftler) kullanılır, böylece kat çifti ile ilgilenir ve önde gelen / sondaki boşlukları iyi idare edebilir.
Tüm bu yaklaşımlarda foldr
(veya başka bir kat, fwiw) kutudan nihai çıktıyı sağlayan işlev değildir; her zaman çıktıyı bir şekilde ayarlamanız gereken başka bir şey vardır.
Bu nedenle, ilk soruya geri dönüyorum ve words
kıvrımlar kullanarak (izleyen / öndeki / tekrarlanan boşlukları doğru şekilde işleyecek şekilde) gerçekten mümkün olup olmadığını soruyorum . Tarafından kat kullanan bir katlama işlevi dış fonksiyonu olmak zorunda olduğu anlamına:
myWords :: String -> [String]
myWords input = foldr step seed input