正则表达式 – haskell中的原始但有效的grep克隆?
每当我考虑学习一种新语言 – 在这种情况下为
haskell – 我试图将一个原始的grep克隆组合在一起,看看语言实现和/或它的库在文本处理方面有多好,因为这对我来说是一个主要的用例.
受到code on the haskell wiki的启发,我想出了以下天真的尝试: {-# LANGUAGE FlexibleContexts,ExistentialQuantification #-} import Text.Regex.PCRE import System.Environment io :: ([String] -> [String]) -> IO () io f = interact (unlines . f . lines) regexBool :: forall r l . (RegexMaker Regex CompOption ExecOption r,RegexLike Regex l) => r -> l -> Bool regexBool r l = l =~ r :: Bool grep :: forall r l . (RegexMaker Regex CompOption ExecOption r,RegexLike Regex l) => r -> [l] -> [l] grep r = filter (regexBool r) main :: IO () main = do argv <- getArgs io $grep $argv !! 0 这似乎正在做我想要的,但不幸的是,它真的很慢 – 比做同样事情的python脚本慢大约10倍.我认为这不是regex库在这里有问题,因为它调用PCRE应该足够快(切换到Text.Regex.Posix会使事情进一步减慢).所以它必须是String实现,从理论的角度来看是有启发性的,但根据我所读的内容效率低下. haskell中的字符串是否有替代方法既高效又方便(即切换到使用它而不是字符串时几乎没有摩擦)并且完全正确地处理UTF-8编码的Unicode,以及其他编码没有太多麻烦,如果可能的话?在haskell中进行文本处理时每个人都使用的东西,但我只是不知道因为我是一个完全的初学者?
使用标准库的列表类型可能导致速度慢.我过去经常遇到性能问题.
分析你的可执行文件,看看它花费的时间是个好主意:Tools for analyzing performance of a Haskell program.分析Haskell程序非常简单(使用开关编译并使用附加参数执行程序,并将报告写入文本文件在当前的工作目录中). 作为旁注,我在学习新语言时使用的方法与您完全相同:创建有效的方法.我使用Haskell的经验是,我可以通过分析和进行相对简单的更改(通常是几行)轻松获得一个或两个数量级的性能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |