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