2012-09-18 93 views
-1

在Ocaml我有一個「全局」(即有文件範圍)數組初始化一些數字,然後我對這些數字做一些操作,然後我調用一個函數來將這些數字求和。現在,因爲這個數組是「全局的」,所以我沒有費力地將數組作爲參數傳遞,最終發生的是Ocaml計算了初始化數字的總和(在編譯時我猜),而不是在對數組進行操作之後已經發生過。我的問題是,爲什麼會發生這種情況?我花了大約3小時試圖追蹤錯誤!這是否與Ocaml的無副作用部分有關?如果是的話,從來沒有這樣的事情發生的規則是什麼?Ocaml操作無序執行

感謝

編輯:你們是非常正確的,我已經從根本上搞砸了。這本質上是我的代碼

let my_array = Array.make 10 0;; 

let sum_array = ...;; 

let my_fun = 
    do_stuff_with_array args; 
    sum_array;; 

所以當然sum_array事先計算。改變它到這個,它的工作,這是最好的解決方案?

let my_array = Array.make 10 0;; 

let sum_array _ = ...;; 

let my_fun = 
    do_stuff_with_array args; 
    sum_array();; 
+5

我想你需要展示一些展現你所說的行爲的代碼。一般來說,OCaml中的評估順序很簡單。 (在某些情況下,訂單具體是未定義的,但這絕對不是這些之一。) –

+0

更新了代碼和修復程序,是我的錯誤.. – foges

回答

4

OCaml確實沒有在「編譯時」計算數組元素的總和。有些東西你不瞭解OCaml評估順序。很難回答你的問題,因爲毫無疑問,它只是告訴我們你在這個話題上有點失落。

這很好,如果我們可以幫助你向你解釋的東西。這會有所幫助,但是,如果你能幫助我們在發現您的不解在於,通過:

  • 給人一種小源代碼示例如您所願
  • 解釋其行爲,你會不會做人預計爲什麼

瞭解OCaml的計算順序一般的事情是,一個模塊或文件中,句子進行評估從上到下,當你寫let x = a in b表達ab前總是評估,並且函數fun x -> a(或等效形式,如let f x = a)會自行評估,而根本不評估a - 這發生在應用程序時間。

有些人喜歡有一個包含代碼所有副作用的「主要」句子。它往往是這樣寫的是:

let() = 
    (* some code that does side-effect *) 

如果你寫了評估代碼,併產生你的文件的另一部分的副作用,那麼,他們將取決於他們是否是之前或之前或這句話後評估之後。

+0

感謝您澄清。只是認爲這是一些編譯時優化.. – foges