2011-09-18 53 views
1

我翻譯的小Mler的功能,在這個數據類型問題寫在F#相互遞歸函數

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. 

回答

5

在你的函數定義中,你使用了and關鍵字來定義e是一組相互遞歸的函數,但是您只給出了第一個函數的名稱。它期望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) 
+0

這是一個衛生署!時刻。謝謝。 – unj2