2013-02-13 87 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 [],您可以返回,這是一個option類型。與oneOf (p::ps)相反,您將返回一個匿名函數,該函數返回option。據推測,你會想要將這個匿名函數應用於某件事情。