0
A
回答
2
Prelude
中的函數words
將爲您篩選空格(根據所需類型查找函數的一種好方法是Hoogle)。
Prelude> :t words
words :: String -> [String]
你只需要使用適當的過濾器,使得使用的Set
撰寫此。這裏是一個非常基本的一個:
import Data.Set (Set, fromList, notMember)
parser :: String -> [String]
parser = words . filter (`notMember` delims)
where delims = fromList ".,!?"
parser "yeah. what?"
將返回["yeah", "what"]
。
檢查出Learn You A Haskell爲一些很好的介紹性材料。
1
你想要Data.List.Split,它涵蓋了絕大多數拆分用例。
對於你的榜樣,只需使用:
splitOneOf ".,!?"
如果你想擺脫連續分隔符之間的「空話」,只需使用:
filter (not . null) . splitOneOf ".,!?"
如果你想那些分隔符來自設置,你已經存儲他們,然後只使用:
import qualified Data.Set as S
s :: S.Set Char
split = filter (not . null) . splitOneOf (S.toList s)
0
當你在學習,這裏是浩從頭開始做。
import qualified Data.Set as S
首先,該組字邊界的:(Data.Set.fromList
需要的元素的列表; [Char]
相同String
,這就是爲什麼我們可以在這種情況下通過一個字符串)
wordBoundaries :: S.Set Char
wordBoundaries = S.fromList " ."
接下來,將字符串分割的話:
toWords :: String -> [String]
toWords = fst . foldr cons ([], True)
where
fst
和foldr
的文檔很清楚,但如果您以前沒有遇到過函數合成,那麼對於.
有點簡潔。
給予toWords
的參數被輸入到foldr cons ([], True)
。 .
然後從foldr cons ([], True)
獲得結果並將其提供給fst
。最後,fst
的結果被用作toWords
本身的結果。
我們仍然定義cons
:
cons :: Char -> ([String], Bool) -> ([String], Bool)
cons ch (words, startNew)
| S.member ch wordBoundaries = ( words, True)
| startNew = ([ch] : words, False)
cons ch (word : words, _) = ((ch : word) : words, False)
作業:制定出什麼cons
做,它是如何工作的。如果您首先確保您瞭解foldr
如何調用它,這可能會更容易。
相關問題
- 1. 解析字符串中的字符
- 2. 簡單的PHP字符串解析
- 3. 解析字符串流的boost單元
- 4. 字符串解析Java中
- 5. 解析字符串
- 6. 解析字符串
- 7. 解析字符串
- 8. 解析JSON字符串時出錯
- 9. SQL解析出多個子字符串
- 10. 解析字符串輸出到文件
- 11. 解析字符串時出現問題
- 12. 解析字符串和子字符串
- 13. 解析字符串 - 從字符串
- 14. 解析字符串 - Http字符串
- 15. 解析出單詞的所有組合
- 16. 解析字符串中的數字
- 17. Python的解析字符串
- 18. 解析Haskell的字符串
- 19. 解析字符串的div
- 20. 的JavaScript:解析字符串
- 21. 解析字符串的strtok()
- 22. 解析字符串的Java
- 23. 解析JSON的字符串
- 24. 解析數字字符串
- 25. 從字符串中的一組單詞中出現一個單詞
- 26. Javascript函數將分析字符串中的單詞嗎?
- 27. 用替換字符串中出現的相同單詞替換字符串
- 28. 當解析XML字符串中「字的‘無法解析
- 29. JAVA:替換字符串中的單詞
- 30. 比較字符串中的單詞
哇,這太棒了!你能否確切地告訴我什麼時候我們應該按照這種方式編寫函數?他們對我來說很棘手。 – user1522145 2012-07-15 01:36:06