【发布时间】:2014-03-24 17:55:55
【问题描述】:
Attoparsec 提供函数skipSpace。
这个函数消耗所有可用的空白。
我怎样才能实现一个函数skipSpaceNoNewline 跳过除\n 和\r\n 之外的任何空格?
注意:这个问题故意显示没有研究工作,因为它是问答式回答的。
【问题讨论】:
标签: haskell attoparsec
Attoparsec 提供函数skipSpace。
这个函数消耗所有可用的空白。
我怎样才能实现一个函数skipSpaceNoNewline 跳过除\n 和\r\n 之外的任何空格?
注意:这个问题故意显示没有研究工作,因为它是问答式回答的。
【问题讨论】:
标签: haskell attoparsec
您可以组合skipWhile 和isEndOfLine(同时匹配\n 和\r\n)。
使用 lambda 函数,您可以将它们组合成一个 skipWhile 谓词,该谓词会跳过除换行符以外的任何空格。
skipSpaceNoNewline = skipWhile (\x -> isSpace_w8 x && not (isEndOfLine x))
【讨论】:
为什么不直接使用skipSpaceNtoNewLine = filter (not.isSpace)?
编辑:我错了。 isSpace 没用。我以为isSpace '\n' 是False 但它是True。直接检查空间即可:
[ghci] putStrLn $ filter (/=' ') $ ";df g; lkdfg\n l sd;lfk sdf"
;dfg;lkdfg
lsd;lfksdf
或确保您过滤正确的内容:
[ghci] putStrLn $ filter (\m-> m `notElem` "\t\f\v") $ ";df g; lk\vdfg\n l sd;lfk sdf"
;df g; lkdfg
l sd;lfk sdf
所以你的函数变成了:
skipSpaceNtoNewLine = filter (\m-> m `notElem` "\t\f\v")
很抱歉让您感到困惑。
【讨论】:
String -> String 的解决方案,但需要的是Parser ()
"\t\f\v",尤其是 unicode。