关于SourceName在parse函数中在Parsec中的意义,我有一个问题。我读过的所有书籍/博客/教程似乎都跳过了它是什么,而使用了"stdin"、"(stdin)"或任意字符串(如"test parser" )。它对指定的SourceName有什么区别吗?
我试着阅读“源代码 of Parsec”,它似乎是用来创建一个职位的。但是为什么它的来源很重要(作为一个String )。听起来,在大多数情况下,我不需要担心。
提前感谢!
发布于 2018-02-09 19:35:12
在Parsec中,SourceName是用于生成错误消息的String。在REPL中,这并不是很重要:
λ> parse expression "<stdin>" ")"
Left "<stdin>" (line 1, column 1):
unexpected ")"
expecting expression如果我们使用的是"foo"而不是"<stdin>",那么如果是这样的话:
Left "foo" (line 1, column 1):
unexpected ")"
expecting expression这在编写一个以多个文件作为输入的程序时非常有用,比如编译器或解释器。例如,在我的解释器中,我具有以下功能:
runFile :: FilePath -> IO ()
runFile path = do code <- readFile path
start <- prelude
evalString path start code >>= putStrLn这里,我将您正在运行的文件的path-the路径传递到解析表达式的函数中。这样,错误消息将告诉您哪个文件有解析错误,以及行号。
λ> runFile "/Users/tikhon/tmp/foo.tpl"
Error: "/Users/tikhon/tmp/foo.tpl" (line 1, column 1):
unexpected ')'
expecting expression or end of input!https://stackoverflow.com/questions/48710847
复制相似问题