我正在翻译一个来自Little Mler的函数,该函数对此数据类型进行操作
type sexp<'T> =
An_Atom of 'T
| A_slist of slist<'T>
and
slist<'T> =
Empty
| Scons of sexp<'T> * slist<'T>函数
// occurs_in_slist : aVal slist -> int
// checks the number of occurrence for aVal in slist
let rec occurs_in_slist =
function
_, Empty-> 0
| (aVal : 'T), Scons(aSexp, (aSlist : 'T)) ->
occurs_in_sexp (aVal, aSexp) + occurs_in_slist (aVal, aSlist)
and
aVal, An_Atom (bVal) -> if (aVal = bVal) then 1 else 0
| (aVal , A_slist(aSlist)) -> occurs_in_slist (aval, aSlist)然而,对于第二个函数,我得到了这个错误
error FS0010: Unexpected symbol '->' in binding. Expected '=' or other token.发布于 2011-09-19 00:37:36
在函数定义中,您使用了and关键字来定义一组相互递归的函数,但是您只为第一个函数指定了一个名称。它期望的是在and之后的另一个函数的名称,这就是为什么你会得到这个错误。不幸的是,您遗漏了这一点。
我相信这就是你想要做的:
let rec occurs_in_slist = function
| _ , Empty -> 0
| aVal : 'T, Scons(aSexp, aSlist : slist<'T>) ->
occurs_in_sexp (aVal, aSexp) + occurs_in_slist (aVal, aSlist)
and occurs_in_sexp = function
| aVal : 'T, An_Atom(bVal) -> if (aVal = bVal) then 1 else 0
| aVal , A_slist(aSlist) -> occurs_in_slist (aVal, aSlist)尽管我觉得这里更合适的返回类型应该是一个bool。
let rec occurs_in_slist = function
| _ , Empty -> false
| aVal : 'T, Scons(aSexp, aSlist : slist<'T>) ->
occurs_in_sexp (aVal, aSexp) || occurs_in_slist (aVal, aSlist)
and occurs_in_sexp = function
| aVal : 'T, An_Atom(bVal) -> aVal = bVal
| aVal , A_slist(aSlist) -> occurs_in_slist (aVal, aSlist)https://stackoverflow.com/questions/7462674
复制相似问题