【问题标题】:SML Parsing with Multiple Parsers使用多个解析器进行 SML 解析
【发布时间】:2013-02-13 16:11:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: parsing sml


    【解决方案1】:

    我认为你在第一种情况下犯了一个错误,它也应该产生一个函数。此外,您需要在递归调用中传递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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-18
        • 2013-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        相关资源
        最近更新 更多