我对(Mega)Parsec的内部运作有一些技术性的问题,其非正式背景是:
通过
Parsec
中的延续来管理错误消息的累积/传播的想法是什么?
具体做法是:
考虑mplus
操作使ParsecT
成为MonadPlus
的实例。
(source)
mplus m n
作为输入,需要一个字符串s
来解析和延续cok
,cerr
,eok
和eerr
,以便根据解析的结果。
首先使用s
解析m
:
s
的一部分,请按照cok
(分别为eok
)继续。s
与[{1}}的解析失败,而m
占用了s
,请按照cerr
继续进行。s
与m
的解析失败而没有消耗任何东西;让err
成为与此失败相关的解析错误。然后我们尝试使用s
解析n
,并相应地选择一个延续:
s
与n
的解析在消费输入时成功,请按照cok
继续进行。s
与n
的解析在消费输入时失败,请按照cerr
继续进行。s
与n
的解析成功而没有消费输入,请按照neok
eok
推导出的neok y s' err' = eok y s' (mergeError err err')
继续:s
n
与neerr
的解析失败而没有消费输入,请按照eerr
的{{1}}延续neerr y s' err' = eerr (mergeError err err')
:if request.method =='POST':
form = FileForm(request.POST, request.FILES)
if form.is_valid():
# file is saved
form.save()
csvfile = request.FILES['f']
try: csvfile.open()
except:
msg = "Cannot open file - is it CSV?"
return render ...
my_data = csv.reader(csvfile)
for row in my_data:
f = fourmisseur (
id_facture = row[0],
numpiece = row[1])
f.save()
我的问题是:
为什么我们在遵循“空”延续时合并错误,而不是在跟随“消耗”延续时合并错误,从而忘记以前的所有错误?
这必须是一个设计决定,但我无法弄清楚其背后的原因。或许有一个简单的例子可以澄清这一点吗?