Проблема написания взаимно рекурсивной функции в F # - PullRequest
1 голос
/ 18 сентября 2011

Я перевожу функцию из 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.

1 Ответ

5 голосов
/ 18 сентября 2011

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