SML解析多个解析器

时间:2013-02-13 01:16:55

标签: parsing sml

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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