我在Haskell中找不到关于如何去除字符串(删除前导/尾随字符)的任何内容,并且没有地方可以找到这样的strip
或chomp
函数(如果我有正确的话)我错了。)
我该怎么办?
答案 0 :(得分:8)
看看Data.Text
。任何使用Prelude列表的内容(例如String
s)通常都会表现不佳,特别是对于stripR
这样的函数。有些人认为这是过去的一个错误,因为它已经感染了许多(其他合理的)接口,因为使用单个链接的字符列表(String
)对文本数据的效率低下。
您要查找的功能依次为:dropWhile
,dropWhileEnd
,dropAround
,stripStart
,stripEnd
,strip
请注意,基于字符相等性,没有特定的剥离功能。你没有真正从谓词dropX
中获取任何内容,除非它是非常常用的Data.Char.isSpace
。
答案 1 :(得分:5)
首先,您应该使用Text
(来自text
包)代替String
,因为text
效率更高。
此外,text
已经具备此功能:
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
答案 2 :(得分:3)
更一般的方法是将谓词传递给strip
函数,因此可以stripL isSpace
例如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}}
可以在不遍历整个输入列表的情况下开始生成输出,并且如果没有长时间运行的元素满足输入的谓词,则效率很高。
答案 3 :(得分:1)
以下是3个函数和3个经过细化的别名函数:
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
?