首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向左/向右剥离一个字符串(和chomp)

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

Stack Overflow用户
提问于 2013-01-10 06:27:32
回答 4查看 3.5K关注 0票数 6

在Haskell中,我没有发现任何关于如何剥离字符串(去除前导/尾随字符)的内容,也没有地方可以找到这样的strip或chomp函数(如果我错了,请纠正我)。

我该怎么办?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-10 06:39:59

看看Data.Text吧。使用Prelude的任何东西,比如Strings,通常性能都很差,特别是使用stripR这样的函数时。一些人认为这是过去的一个错误,因为它已经影响了许多(否则是合理的)接口,使其在文本数据中使用单链接字符列表(String)的低效。

您要查找的函数依次为:dropWhile、dropWhileEnd、dropAround、stripStart、stripEnd、strip。

请注意,对于基于字符相等的剥离,没有特定的函数。除非是像Data.Char.isSpace这样的非常常用的谓词,否则使用谓词给dropX设置别名并不能真正获得任何好处。

票数 8
EN

Stack Overflow用户

发布于 2013-01-10 06:38:22

首先,您应该使用Text (来自text包)而不是String,因为text要高效得多。

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

代码语言:javascript
复制
-- Remove leading and trailing white space from a string.
strip :: Text -> Text
票数 5
EN

Stack Overflow用户

发布于 2013-01-10 06:39:39

更通用的方法是将谓词传递给strip函数,这样就可以使用stripL isSpace,例如删除所有前导空格。

然而,stripL只是dropWhile的一个别名。

对于末尾的剥离,可能更有效的版本使用foldr,

代码语言:javascript
复制
stripR :: (a -> Bool) -> [a] -> [a]
stripR pred = foldr keepOrDrop []
  where
    keepOrDrop c xs
        | pred c    = case xs of
                        [] -> []
                        _  -> c:xs
        | otherwise = c:xs

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14247647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档