0

パーサーのリストを取得し、成功するまで 1 つずつ試行する関数を実装しようとしています。リスト内のパーサーが成功しない場合、パーサー全体が失敗します。これが私の試みです:

    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 []返されます。代わりに、を返す無名関数を返します。おそらく、その匿名関数を何かに適用したいと思うでしょう。NONEoptiononeOf (p::ps)option

于 2013-02-13T07:44:00.157 に答える