2013-02-13 3 views
0

Я пытаюсь реализовать функцию, которая возьмет список парсеров и пробует их один за другим, пока вы не добьетесь успеха. Если синтаксический анализатор в списке не завершится успешно, общий синтаксический анализатор завершится с ошибкой. Вот моя попытка:SML Parsing with Multiple Parsers

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

Я получаю много операторов/операндов, не согласных с ошибками. Любые намеки на то, где я ошибаюсь?

ответ

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 
0

Ваши типы не совпадают. С oneOf [] вы возвращаете NONE, который является option. С oneOf (p::ps) вы вместо этого возвращаете анонимную функцию, которая возвращает option. Предположительно, вы захотите применить эту анонимную функцию к чему-то.