我没有发现如何在 Haskell 中删除字符串(删除前导/尾随字符),并且没有地方可以找到这样的strip
或chomp
函数(如果我错了,请纠正我)。
我要做什么?
看看Data.Text
。任何使用 Prelude 列表的东西,例如String
s,通常表现不佳,尤其是像stripR
. 一些人认为这是过去的错误,因为它已经感染了许多(否则是明智的)接口,因为使用字符单链表 ( String
) 处理文本数据的效率低下。
您要查找的功能依次为:dropWhile
, dropWhileEnd
, dropAround
, stripStart
, stripEnd
, strip
.
请注意,没有基于字符相等性的剥离的特定功能。dropX
除非它是一个非常常用的谓词,否则你并没有真正从谓词中获得任何好处Data.Char.isSpace
。
首先,您应该使用Text
(from the text
package) 而不是String
,因为text
效率更高。
另外,text
已经有了这个功能:
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
更通用的方法是将谓词传递给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
它可以在不遍历整个输入列表的情况下开始产生输出,并且如果没有长时间运行的元素满足谓词作为输入,那么它是有效的。
这里有 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
?