剥离左/右一个字符串(和chomp)

时间:2013-01-09 22:27:32

标签: haskell

我在Haskell中找不到关于如何去除字符串(删除前导/尾随字符)的任何内容,并且没有地方可以找到这样的stripchomp函数(如果我有正确的话)我错了。)

我该怎么办?

4 个答案:

答案 0 :(得分:8)

看看Data.Text。任何使用Prelude列表的内容(例如String s)通常都会表现不佳,特别是对于stripR这样的函数。有些人认为这是过去的一个错误,因为它已经感染了许多(其他合理的)接口,因为使用单个链接的字符列表(String)对文本数据的效率低下。

您要查找的功能依次为:dropWhiledropWhileEnddropAroundstripStartstripEndstrip

请注意,基于字符相等性,没有特定的剥离功能。你没有真正从谓词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