0

我正在尝试实现一个函数,该函数将获取解析器列表并一个一个地尝试它们,直到一个成功。如果列表中没有解析器成功,则整个解析器将失败。这是我的尝试:

    fun oneOf [] = NONE
      | oneOf (p::ps) = fn inp => case parse p inp of
              NONE => oneOf ps
            | SOME (v,out) => SOME (v,out)

我收到许多运算符/操作数不同意错误。关于我哪里出错的任何提示?

4

2 回答 2

2

我认为你在第一种情况下犯了一个错误,它也应该产生一个函数。此外,您需要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
于 2013-02-13T08:11:57.280 回答
0

你的类型不匹配。使用oneOf [],您返回NONE,这是一种option类型。oneOf (p::ps)而是返回一个匿名函数,该函数返回一个option. 大概,您会想要将该匿名函数应用于某些东西。

于 2013-02-13T07:44:00.157 回答