6

我没有发现如何在 Haskell 中删除字符串(删除前导/尾随字符),并且没有地方可以找到这样的stripchomp函数(如果我错了,请纠正我)。

我要做什么?

4

4 回答 4

8

看看Data.Text。任何使用 Prelude 列表的东西,例如Strings,通常表现不佳,尤其是像stripR. 一些人认为这是过去的错误,因为它已经感染了许多(否则是明智的)接口,因为使用字符单链表 ( String) 处理文本数据的效率低下。

您要查找的功能依次为:dropWhile, dropWhileEnd, dropAround, stripStart, stripEnd, strip.

请注意,没有基于字符相等性的剥离的特定功能。dropX除非它是一个非常常用的谓词,否则你并没有真正从谓词中获得任何好处Data.Char.isSpace

于 2013-01-09T22:39:59.320 回答
5

首先,您应该使用Text(from the textpackage) 而不是String,因为text效率更高。

另外,text已经有了这个功能:

-- Remove leading and trailing white space from a string.
strip :: Text -> Text
于 2013-01-09T22:38:22.020 回答
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

它可以在不遍历整个输入列表的情况下开始产生输出,并且如果没有长时间运行的元素满足谓词作为输入,那么它是有效的。

于 2013-01-09T22:39:39.267 回答
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

于 2013-01-09T22:27:32.243 回答