我正在翻译Little Mler中运行此数据类型的函数
type sexp<'T> =
An_Atom of 'T
| A_slist of slist<'T>
and
slist<'T> =
Empty
| Scons of sexp<'T> * slist<'T>
Run Code Online (Sandbox Code Playgroud)
功能
// 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)
Run Code Online (Sandbox Code Playgroud)
但是,我得到第二个函数的这个错误
error FS0010: Unexpected symbol '->' in binding. Expected '=' or other token.
Run Code Online (Sandbox Code Playgroud)
在函数定义中,您已使用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)
Run Code Online (Sandbox Code Playgroud)
虽然我觉得这里更合适的回归类型应该是一个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)
Run Code Online (Sandbox Code Playgroud)