我想在Haskell中做一些简单的文本处理,我想知道在FP语言中我最好的方法是什么.我查看了parsec模块,但这看起来比我作为一个新的Haskeller要复杂得多.从文本语料库中删除所有标点符号的最佳方法是什么?我天真的做法是制作这样的函数:
removePunc str = [c | c <- str, c /= '.',
c /= '?',
c /= '.',
c /= '!',
c /= '-',
c /= ';',
c /= '\'',
c /= '\"',]
Run Code Online (Sandbox Code Playgroud)
huo*_*uon 11
一个可能更有效的方法(O(log n)而不是O(n)),是使用a Set(来自Data.Set):
import qualified Data.Set as S
punctuation = S.fromList ",?,-;'\""
removePunc = filter (`S.notMember` punctuation)
Run Code Online (Sandbox Code Playgroud)
您必须在函数外部构造集合,以便它只计算一次(通过在所有调用之间共享),因为创建集合的开销远大于notElem其他人建议的简单线性时间测试.
注意:这是一个很小的情况,一个额外的开销Set可能会超过集合与列表的渐近优势,所以如果一个人正在寻找绝对性能,那么必须对其进行分析.
你可以简单地编写你的代码:
removePunc = filter (`notElem` ".?!-;\'\"")
Run Code Online (Sandbox Code Playgroud)
要么
removePunc = filter (flip notElem ".?!-;\'\"")
Run Code Online (Sandbox Code Playgroud)