arp*_*pho 5 parsing haskell attoparsec
建议我使用attoparsec来解析文件,现在我必须要了解如何使用它; 有人给了我这段代码:
type Environment = M.Map String String
import Data.Attoparsec (maybeResult)
import qualified Data.Attoparsec.Char8 as A
import qualified Data.ByteString.Char8 as B
environment :: A.Parser Environment
environment = M.fromList <$> A.sepBy entry A.endOfLine
parseEnvironment = maybeResult .flip A.feed B.empty . A.parse environment
spaces = A.many $ A.char ' '
entry = (,) <$> upTo ':' <*> upTo ';'
upTo delimiter = B.unpack <$> A.takeWhile (A.notInClass $ delimiter : " ")
<* (spaces >> A.char delimiter >> spaces)
Run Code Online (Sandbox Code Playgroud)
效果很好,但我不知道为什么:使用翻转的原因是什么,将A.feed的参数置于不同的顺序并不容易?为什么有B.empty?有一些关于我可以学习的教程吗?提前致谢
在此StackOverflow问题feed的答案中有对的解释。正如Bryan O'Sullivan(Attoparsec的创建者)所说:
如果编写了一个attoparsec解析器,该解析器在失败之前消耗了尽可能多的输入,则必须在到达输入结尾时告诉部分结果继续。
您可以通过为它提供一个空字节串来实现。
我承认我写了有问题的代码,pointfree在这种情况下我实际上没有使用。简单的组合对我来说很有意义:您运行解析器(A.parse environment),告诉您已完成(flip A.feed B.empty),然后将其转换Maybe为一种基本的错误处理(maybeResult)。我认为这比指向的版本干净:
parseEnvironment b = maybeResult $ A.feed (A.parse environment b) B.empty
Run Code Online (Sandbox Code Playgroud)
其余的我认为是相当惯用的应用程序解析,尽管我不确定为什么我会使用>>而不是*>。