Parsing 使用多个解析器进行SML解析
我正在尝试实现一个函数,它将获取一个解析器列表,并逐个尝试,直到一个成功。如果列表中没有解析器成功,那么整个解析器将失败。以下是我的尝试:Parsing 使用多个解析器进行SML解析,parsing,sml,Parsing,Sml,我正在尝试实现一个函数,它将获取一个解析器列表,并逐个尝试,直到一个成功。如果列表中没有解析器成功,那么整个解析器将失败。以下是我的尝试: fun oneOf [] = NONE | oneOf (p::ps) = fn inp => case parse p inp of NONE => oneOf ps | SOME (v,out) => SOME (v,out) 我发现许多运算符/操作数不一致错误。
fun oneOf [] = NONE
| oneOf (p::ps) = fn inp => case parse p inp of
NONE => oneOf ps
| SOME (v,out) => SOME (v,out)
我发现许多运算符/操作数不一致错误。有没有关于我哪里出错的提示?您的类型不匹配。使用[]中的
one,返回NONE
,这是一个选项
类型。使用oneOf(p::ps)
返回一个匿名函数,该函数返回一个选项
。想必,您会想将匿名函数应用于某个对象。我认为您在第一种情况下犯了一个错误,这也应该产生一个函数。此外,您需要在递归调用中传递inp
。即:
fun oneOf [] = fn inp => NONE
| oneOf (p::ps) = fn inp => case parse p inp of
NONE => oneOf ps inp
| SOME (v,out) => SOME (v,out)
或更短:
fun oneOf [] inp = NONE
| oneOf (p::ps) inp =
case parse p inp of
NONE => oneOf ps inp
| some => some