2013-06-05 128 views
0

我是Ocaml的新手,希望獲得關於在遞歸數據類型上定義的遞歸函數的幫助。我已經如下ocaml相互遞歸錯誤

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

我正在寫檢查在定義SLIST的符號的函數(SUBST)和用b替換它定義的數據類型。對於例子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

你的代碼不能編譯,它包含一個未關閉的註釋和語法錯誤上的第三個'匹配' – Thomash

回答

1

你的類型可以以更簡單的方式來定義,你不需要slist

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

您的問題是subst a b S[q]讀爲subst a b S [q],即SUBST應用的功能到4個參數。您必須改寫subst a b (S[q])

+0

明白了,謝謝! – user2352241