6
A
回答
8
看看Data.Text
。任何使用Prelude列表的東西,例如String
,通常表現不佳,尤其是像stripR
這樣的功能。有些人認爲這是過去的錯誤,因爲它已經感染了很多(否則是合理的)接口,並且因爲使用單向鏈接的字符列表(String
)對文本數據使用效率低下。
你要找的功能,依次爲:dropWhile
,dropWhileEnd
,dropAround
,stripStart
,stripEnd
,strip
。
請注意,基於字符相等沒有特定的剝離功能。除非是非常常用這樣的Data.Char.isSpace
,否則你並沒有真正從別名中獲取任何含有假名的別名dropX
。
1
這裏有3個功能和3 currified別名功能,使其通過:
stripL :: Char -> String -> String
stripL x = dropWhile (==x)
stripR :: Char -> String -> String
stripR x = reverse . stripL . reverse
strip :: Char -> String -> String
strip x = stripL x . stripR x
chompL :: String -> String
chompL = stripL ' '
chompR :: String -> String
chompR = stripR ' '
chomp :: String -> String
chomp = strip ' '
你覺得呢?是否可以將這些功能添加到Data.String
?
5
首先,您應該使用Text
(來自text
包)而不是String
,因爲text
效率更高。
此外,text
已經有這樣的功能:
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
3
的更一般的方法將是一個謂詞傳遞給strip
的功能,所以一個可能stripL isSpace
例如刪除所有領先的空白。
Then stripL
然而只是dropWhile
的別名。
對於最終的剝離,一個潛在的更高效的版本使用foldr
,
stripR :: (a -> Bool) -> [a] -> [a]
stripR pred = foldr keepOrDrop []
where
keepOrDrop c xs
| pred c = case xs of
[] -> []
_ -> c:xs
| otherwise = c:xs
,可以開始生產輸出而無需遍歷整個輸入列表,並且是有效的,如果有元件的滿足無長期運行謂詞它的輸入。
相關問題
- 1. 從vb6中的字符串的右側和左側刪除某個字符(TrimChar)
- 2. 斯卡拉:字符串Chomp
- 3. 迭代過去的字符串和從字符串中去除字符串
- 4. PHP echo從右到左的一個字符串的一部分
- 5. 將字符串從右到左移動到一個字符串中
- 6. 字符串去除字符的字符
- 7. 去除條目的第一個字符數字符串列表
- 8. 格式字符串 - 墊雙左右
- 9. 串聯左,右對齊字符類型
- 10. 如果我有Perl 4,我該如何chomp一個字符串?
- 11. Java字符去除串
- 12. 去除(JSON)字符串
- 13. 去除串字符 - Visual C
- 14. 從字符串去除XML
- 15. C - 從另一個字符串中減去一個字符串
- 16. 除去最後的字符串除去字符
- 17. Chomp將字符串更改爲1
- 18. SQL查詢刪除字段中的左側和右側字符
- 19. 去掉字符串中的最後一個字符和第一個字符
- 20. 如何保存去除串在一個新的字符串
- 21. 從一個字符串除了數字和貨幣分母剝去一切
- 22. 從unicode字符串去除特殊字符和標點符號
- 23. 左移和右移字符(ASCII值)。
- 24. 剝離字符的左側和右側
- 25. MS SQL 2012從右側和左側刪除重複字符
- 26. 什麼Regex可以去除例如字符串左邊的「note:」和「firstName:」?
- 27. 左右移動字符
- 28. 從左側和右側修剪字符串
- 29. 刪除左邊的一個字符 - Unix
- 30. 如何從左到右和從右到左動畫一個ImageView
http://hackage.haskell.org/packages/archive/MissingH/1.0.0/doc/html/Data-String-Utils.html – Shmiddty