2009-10-15 68 views
3

來自Java和C背景,掌握Ocaml的一些概念一直很有趣。其中之一就是,讓一個/ multiple語句在for循環中運行。OCaml - For Loop內部如果聲明

 
let test_method (x:vector list)(vec:vector) = 
    if List.length x != 0 then 
      {a=0.;b=0.} (* Return a vector of 0,0 *) 
     else 
      for i = 0 to List.length x do 
         let key = {a=(List.nth x i).a;b=(List.nth x i).b} 
       done;; 

我得到的錯誤已完成;是一個意外的標記。這是爲什麼發生?這種情況發生,即使我這樣做

 
let test_method (x:vector list)(vec:vector) = 
    if List.length x != 0 then 
      {a=0.;b=0.} (* Return a vector of 0,0 *) 
     else 
      for i = 0 to List.length x do 
         let key = {a=(List.nth x i).a;b=(List.nth x i).b} in 
         let value = vec_neg key; 
       done;; 

其中vec_neg是一種正常工作,否定矢量類型的方法。

任何幫助將不勝感激。

+0

你能解釋一下你在這裏完成的意思嗎?這對我來說似乎沒有意義。而且,for循環在OCaml中的使用要少於C和Java等語言,因此可能有更好的方法來實現它。 – Chuck 2009-10-15 05:38:28

回答

3

let表達式必須有一個主體。 (即let var = val in body)(除了讓模塊頂層的定義,它隱式地使用模塊的其餘部分作爲主體)let創建了一個侷限在主體內的本地綁定。如果你不使用它(即沒有身體),那麼做什麼?此外,語言中的每個表達式都必須評估爲一個值。一個let表達式評估任何身體評估。這就是爲什麼它需要一個身體。

1

當你寫下let foo = bar之後,你必須寫in然後再寫一個「賦值」。編譯器期望in但遇到done,這是「意外」。

您應該刪除let或添加in,這取決於您的目標是什麼。