2013-06-12 138 views
-3

我有這個本地函數。我必須寫一個let ... in,因爲在其他情況下,我會收到語法錯誤。我怎樣才能做到這一點不僅before而且after呢!遠的不說,看起來像在此之前:如何使用let in(在ocaml中)編寫遞歸函數

before = "a/drivers/usb/gadget/.../file" 

after看起來是這樣的:

after = "b/drivers/usb/gadget/..../file"` 

和我的記錄功能如下:

let rec f (before: string list) : string list = 
      begin match Str.split (Str.regexp "/") before with 
         | _ ::rest -> out (String.concat "/" rest) 
         | _ ->() 
       end 
+1

什麼問題(如果有的話)? – Thomash

回答

1

你提的問題是非常困難的理解,但如果我有它的權利:一個功能的本質是,你可以多次調用它,只要你喜歡,用不同的參數。

let sqdist (x0, y0) (x1, y1) = 
    let sq a = a * a in 
    sq (x1 - x0) + sq (y1 - y0) 

在這裏,我定義sq作爲本地函數,我稱它既爲x1 - x0y1 - y0

更新:

現在您的函數應該處理列表中的所有元素的聲音給我。這是你在現實生活中會使用List.map的東西。做遞歸自己的映射,你的代碼會是這個樣子:

let squareEveryInt (list: int list) : int list = 
    let rec go l = 
     match l with 
     | [] -> [] 
     | n :: rest -> n * n :: go rest 
    in 
    go list 

有從你的示例代碼這裏許多重要的差異。我認爲你缺少的主要是遞歸調用你的函數。

+0

是我的函數「let rec」是本地的!甚至讓rec!所以不得不使用let而不是let rec? – mirou

+1

「rec」的使用完全取決於您的功能是否需要自行調用。如果它不需要自行調用,則不需要「rec」。你的示例代碼不會調用它自己,所以我懷疑你可以放棄'rec'。但我懷疑這是你的基本問題,因爲指定'rec'也不會傷害。 –

+0

事情是我的exepmle假設解析一行,刪除該行的第一個元素,printf其餘的(用「/」來解析元素),所以我認爲這是一個rec函數,因爲它每次調用它自己,一遍又一遍地做!也許我錯了!但這是我的看法!我錯了? – mirou