2013-06-05 3 views
0

Я новичок в Ocaml и хочу помочь с рекурсивной функцией, определенной для рекурсивного типа данных. Я определил тип данных следующегоocaml взаимная ошибка рекурсии

type 'a slist = S of 'a sexp list 
    and 
    'a sexp = Symbol of 'a | L of 'a slist 

Функции (Подст) Я пишу чеки для символа а в определенном SLIST и заменяет его на б. Для ex subst 1 10 S [1; 4; S [L [3; 1;]; 3];] возвращает S [10; 4; S [L [S [3; 10;]]; 3;] . Мой код выглядит следующим образом

let rec subst a b sl = match sl with 
    S s -> match s with 
      [] -> [] 
      | p :: q -> match p with 
       Symbol sym -> if sym = a then S[b] :: (**subst** a b S[q]) else 
           S[p] :: (subst a b S[q]) 
       L l -> (subst a b l) :: (subst a b S[q]) 
    | L lis -> subst a b lis;; 

я получаю ошибку:

Эта функция применяется слишком много аргументов; Возможно, вы забыли «;»

Пожалуйста, помогите

+0

ваш код не компилируется, он содержит незаблокированный комментарий и синтаксическую ошибку на третьем 'match' – Thomash

ответ

1

Ваш тип может быть определен более простым способом, вам не нужно slist:

type 'a sexp = Symbol of 'a | L of 'a sexp list 

Ваша проблема заключается в том, что subst a b S[q] читается как subst a b S [q], то есть функция Подст применяется до 4 аргументов. Вместо этого вы должны написать subst a b (S[q]).

+0

Получил это, спасибо! – user2352241