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