2011-03-27 64 views
7

我在ocaml中實現數組時遇到了一些小問題。例如,終端(konsole中)和I上時鍵入Ocaml實現

let tab = Array.make 5 6; 

我有

val tab : int array = [|6; 6; 6; 6; 6|] 

作爲輸出。所以它創建一個長度爲5的數組,並用6填充所有的情況。好吧,我理解那個部分。但是,當我在一個文本編輯器,像Kate例如鍵入它,將它保存並編譯它,我得到這個錯誤:

Error: Unbound value Array.make 

我不明白爲什麼需要數組。在kate中作爲一個值,它將Array.make作爲終端中的一個函數。我用「.ml」擴展名保存了文件,並使用​​進行編譯。 有什麼建議嗎?謝謝。

回答

5

我編譯你的程序ocamlc它很好(使用OCaml 3.12.0)。

我想你會在編譯時調用編譯器的舊版本,或許Array.make仍然命名爲Array.create。也許當你安裝新版本時,你重寫了一些文件(比如頂層文件)而不是其他文件(比如編譯器)。爲了檢查,比較由ocamlc -vocaml給出的版本。

至於消息「Unbound value」,在OCaml中,函數是值。實現者沒有區分「不是函數的非綁定值」和「非函數值是函數」,但這不是問題的原因。你的問題的原因是Array.make根本沒有被綁定。

+0

他們都給了我相同的版本。版本3.11.2。我不認爲我覆蓋了屬於以前版本的任何文件。我剛剛在我的電腦上安裝了linux,所以我沒有安裝以前版本的ocaml。我通過輸入ocaml進行了驗證,它寫道ocaml尚未安裝,所以我只是安裝了它。此版本3.11.2。我嘗試Array.create,但我仍然遇到同樣的問題。你認爲這是因爲我使用的版本? – mkab 2011-03-27 18:04:31

+0

@mktab它肯定應該使用版本3.11.2。版本3.12.0會告訴你它是模塊'Array'還是函數'make',它們是未綁定的,這是該版本帶來的許多小改進之一,但是你得到的錯誤仍然是一個謎。 – 2011-03-28 03:27:40

+2

@mktab編譯器找不到文件.../lib/ocaml/array.cmi。也許它丟失了,或者你的發行版的軟件包是通過複製目標以外的文件來編寫的,而不是編譯器被配置爲安裝。如果是這種情況,你可以通過使用選項-I和-L來修復它,但是我'd建議從源頭重新編譯OCaml。 – 2011-03-28 03:36:21

3

我發現了錯誤。這是一個非常愚蠢的。我將我的文件保存爲「array.ml」。所以在編譯期間,它創建了一個array.cmi文件,我認爲它與在/ lib/ocaml/array.cmi中找到的文件有點混淆。我不太確定。所以我將文件重命名爲「table.ml」,並且編譯完美。它很瘋狂,它混淆了這兩個文件

+0

如何明確指定'../ lib/ocaml/array.cmi'呢? – updogliu 2012-07-15 13:21:05