Real World Haskell, ตอนที่ 4, หน้า 98 ของการพิมพ์ถามว่าwords
สามารถนำไปใช้โดยใช้ folds หรือไม่และนี่คือคำถามของฉันเช่นกัน:
เป็นไปได้ไหม? ถ้าไม่ทำไม ถ้ามันเป็นอย่างไร
ฉันคิดว่าสิ่งต่อไปนี้จะขึ้นอยู่กับความคิดที่ว่าแต่ละช่องว่างควรจะเติมคำสุดท้ายในรายการเอาท์พุท (นี้เกิดขึ้นในotherwise
ยาม) และช่องว่างที่ควรจะเพิ่มคำ emtpy รายการเอาท์พุทหากยังไม่ได้มีอยู่ (มีการจัดการใน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
เห็นได้ชัดว่าการแก้ปัญหานี้ไม่ถูกต้องเนื่องจากช่องว่างนำหน้าในสตริงอินพุตส่งผลให้มีหนึ่งสตริงว่างนำหน้าในรายการเอาต์พุตของสตริง
ที่ลิงก์ด้านบนฉันได้ดูวิธีแก้ปัญหาที่เสนอสำหรับผู้อ่านคนอื่น ๆ และหลายคนทำงานคล้ายกับโซลูชันของฉัน แต่โดยทั่วไปแล้วพวกเขา "โพสต์กระบวนการ" ผลลัพธ์ของรอยพับตัวอย่างเช่นtail
หากมี เป็นสตริงนำที่ว่างเปล่า
วิธีการอื่น ๆ ใช้ tuples (อันที่จริงแค่จับคู่) ดังนั้นการพับที่เกี่ยวข้องกับคู่และสามารถจัดการช่องว่างนำหน้า / ท้าย
ในวิธีการเหล่านี้ทั้งหมดfoldr
(หรืออีกโฟลด์, fwiw) ไม่ได้เป็นฟังก์ชั่นที่ให้ผลลัพธ์สุดท้ายออกจากกล่อง; มีอย่างอื่นที่มีการปรับเอาท์พุทอย่างใด
ดังนั้นฉันกลับไปที่คำถามเริ่มต้นและถามว่ามันเป็นไปได้จริงที่จะใช้words
(ในวิธีที่มันถูกต้องจัดการช่องว่างต่อท้าย / นำ / ซ้ำ /) โดยใช้เท่า โดยการใช้การพับผมหมายถึงฟังก์ชั่นการพับจะต้องเป็นฟังก์ชั่นนอกสุด:
myWords :: String -> [String]
myWords input = foldr step seed input