2013-02-13 7 views
0

구문 분석기 목록을 취하여 하나가 성공할 때까지 하나씩 시도하는 함수를 구현하려고합니다. 목록에 파서가 없으면 전체 구문 분석기가 실패합니다. 여기에 내 시도가있다 :여러 구문 분석기로 SML 구문 분석

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을 반환합니다. oneOf (p::ps)을 사용하면 대신 option을 반환하는 익명의 함수가 반환됩니다. 아마도 익명의 기능을 무언가에 적용하기를 원할 것입니다.