В своем определении функции вы использовали ключевое слово 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)