在Haskell中,如何从字符串的开头和结尾修剪空格?

Eri*_*and 47 string haskell trim removing-whitespace

如何从字符串的开头和结尾修剪空格?

trim "  abc " 

=>

"abc"
Run Code Online (Sandbox Code Playgroud)

编辑:

好的,让我更清楚一点.我不明白字符串文字与字符串的处理方式如此不同.

我想这样做:

import qualified Data.Text as T
let s :: String = "  abc  "
in T.strip s
Run Code Online (Sandbox Code Playgroud)

这在Haskell有可能吗?我正在使用-XOverloadedStrings,但这似乎只适用于文字.

Tho*_*son 56

如果您有严格的文本处理需求,请使用texthackage中的包:

> :set -XOverloadedStrings
> import Data.Text
> strip "  abc   "
"abc"
Run Code Online (Sandbox Code Playgroud)

如果你太顽固地使用text并且不喜欢反向方法的低效率,那么也许(我的意思是MAYBE)类似下面的东西会更有效:

import Data.Char

trim xs = dropSpaceTail "" $ dropWhile isSpace xs

dropSpaceTail maybeStuff "" = ""
dropSpaceTail maybeStuff (x:xs)
        | isSpace x = dropSpaceTail (x:maybeStuff) xs
        | null maybeStuff = x : dropSpaceTail "" xs
        | otherwise       = reverse maybeStuff ++ x : dropSpaceTail "" xs


> trim "  hello this \t should trim ok.. .I  think  ..  \t "
"hello this \t should trim ok.. .I  think  .."
Run Code Online (Sandbox Code Playgroud)

我写这在假设的空间长度将是最小的,所以你的O(n)的++reverse是很少关注.但我再次觉得有必要说,如果你真的关心性能,那么你根本就不应该使用String- 转而去Text.

编辑提出我的观点,一个快速的标准基准告诉我(对于一个特别长的字符串空格和约200个前后空格)我的修剪需要1.6毫秒,使用反向的修剪需要3.5 Data.Text.strip毫秒,并需要0.0016毫秒.. .

  • 基准+1,当人们真正证明他们的主张时,它是伟大的 (5认同)
  • 谢谢你的推荐.我说服我的团队为项目添加文本,这样可以省去很多麻烦. (3认同)

Eri*_*and 35

来自:http://en.wikipedia.org/wiki/Trim_ (programming)#Haskell

import Data.Char (isSpace)

trim :: String -> String
trim = f . f
   where f = reverse . dropWhile isSpace
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单的.对于快速而肮脏的用例,这很好. (16认同)
  • 这是非常低效的. (7认同)
  • 这很漂亮,虽然我会使用`let`绑定. (3认同)

spo*_*joy 24

这个问题被问(大约2012)后,Data.List得到了dropWhileEnd使这是一个容易得多:

trim = dropWhileEnd isSpace . dropWhile isSpace
Run Code Online (Sandbox Code Playgroud)

  • 对于那些对点运算符(用于函数组合)感到困惑的人来说,这相当于 `trim :: String -> String` `trim xs = dropWhile isSpace (dropWhileEnd isSpace xs)`。/sf/ask/44189911/ http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-List.html #v:dropWhileEnd (3认同)
  • 对于初学者(像我一样):此解决方案要求您首先“导入 Data.List” 和“导入 Data.Char”。 (2认同)

Sim*_*ael 15

低效但易于理解并粘贴到需要的地方:

strip = lstrip . rstrip
lstrip = dropWhile (`elem` " \t")
rstrip = reverse . lstrip . reverse
Run Code Online (Sandbox Code Playgroud)