我正在尝试实现一个函数,该函数将获取解析器列表并逐个尝试,直到一个成功。如果列表中没有解析器成功,则整个解析器失败。这是我的尝试:
fun oneOf [] = NONE
| oneOf (p::ps) = fn inp => case parse p inp of
NONE => oneOf ps
| SOME (v,out) => SOME (v,out)
我得到许多运算符/操作数不同意错误。关于我哪里出错的任何提示?
答案 0 :(得分: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
答案 1 :(得分:0)
您的类型不匹配。使用oneOf []
,您将返回NONE
,这是option
类型。使用oneOf (p::ps)
,您将返回一个返回option
的匿名函数。据推测,你会想要将匿名函数应用于某些东西。