Parsing 在本例中,为什么不尝试触发回溯

Parsing 在本例中,为什么不尝试触发回溯,parsing,haskell,parsec,Parsing,Haskell,Parsec,我试图在Haskell中使用parsec编写解析器,特别是回溯的工作原理 以下面的简单解析器为例: import Text.Parsec 类型Parser=Parsec String()字符串 parseConst::解析器 parseConst=do{ 这里有很多问题 首先,parseConst永远无法正常工作。该类型表示它必须生成一个String,因此read::String->String。特定的read实例要求输入为带引号的字符串,因此向read传递0个或更多数字字符总是会导致调用错误如

我试图在Haskell中使用parsec编写解析器,特别是回溯的工作原理

以下面的简单解析器为例:

import Text.Parsec
类型Parser=Parsec String()字符串
parseConst::解析器
parseConst=do{

这里有很多问题

首先,
parseConst
永远无法正常工作。该类型表示它必须生成一个
String
,因此
read::String->String
。特定的
read
实例要求输入为带引号的字符串,因此向
read
传递0个或更多数字字符总是会导致调用
错误如果您尝试评估它产生的值

其次,
parseConst
可以成功匹配零个字符。我认为您可能想要
一些
,而不是
许多
。如果遇到的输入不是以数字开头的,那么它实际上会失败


第三,
()
没有做你想做的。你可能会认为
(a这里有很多问题

首先,
parseConst
永远无法正常工作。该类型表示它必须生成一个
String
,因此
read::String->String
。特定的
read
实例要求输入为带引号的字符串,因此向
read
传递0个或更多数字字符总是会导致调用
错误如果您尝试评估它产生的值

其次,
parseConst
可以成功匹配零个字符。我认为您可能想要
一些
,而不是
许多
。如果遇到的输入不是以数字开头的,那么它实际上会失败


第三,
()
没有按照你的想法做。你可能会认为
(当
parseConst
失败时,a
try
使用原始输入创建
parseExpr
尝试
parseAdd
。但在这种情况下,
parseConst
成功解析
1
,因此此
try
不起任何作用。
try
使用原始输入创建
parsexpr
try
parseAdd
)en
parseConst
失败。但是在这种情况下,
parseConst
成功解析了
1
,所以这个
try
没有任何作用。谢谢!在我达到之前的YACC水平之前,我似乎还有很多事情要做:)。谢谢!在我达到之前的YACC水平之前,我似乎还有很多事情要做:)。
Left (line 1, column 2):
unexpected '+'
expecting digit or end of input