2011-03-27 17 views
7

Ho avuto un piccolo problema nell'implementare gli array in ocaml. Ad esempio, quando sul terminale (konsole) e digitareImplementazione Ocaml

let tab = Array.make 5 6; 

Ho

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

come uscita. Quindi crea un array con una lunghezza di 5 e riempie tutti i casi con 6. Ok, capisco quella parte. Ma quando si digita su un editor di testo come kate per esempio, salvarlo e compilarlo io ottenere questo errore:

Error: Unbound value Array.make 

Non capisco perché ci vuole Array. crea come valore in kate e prende Array.make come una funzione nel terminale. Ho salvato il file con l'estensione ".ml" e lo compilo usando ocamlc -o test name_of_file. Qualche suggerimento, per favore? Grazie.

risposta

5

Ho compilato il programma con ocamlc ed è andato bene (usando OCaml 3.12.0).

Direi che si sta chiamando una vecchia versione del compilatore quando si tenta di compilare, forse uno da quando Array.make si chiamava ancora Array.create. Forse quando hai installato la nuova versione, hai sovrascritto alcuni file (come il toplevel) ma non altri (come il compilatore). Per verificare, confrontare le versioni fornite da ocamlc -v e ocaml.

Come per il messaggio "Valore non associato", in OCaml, le funzioni sono valori. Gli implementatori non hanno distinto tra "Valore non associato che non è una funzione" e "Valore non associato che è una funzione", ma questa non è la causa del problema. La causa del tuo problema è che Array.make non è associato affatto.

+0

Entrambi mi hanno dato la stessa versione. Versione 3.11.2. Non penso di aver sovrascritto alcun file appartenente a una versione precedente. Ho appena installato linux sul mio pc, quindi non ho avuto la versione precedente di ocaml. Ho verificato semplicemente digitando ocaml e ha scritto che ocaml non è ancora installato, quindi l'ho appena installato .. questa versione 3.11.2. Ho provato Array.create ma ho ancora lo stesso problema. Pensi che sia dovuto alla versione che sto usando? – mkab

+0

@mktab Dovrebbe funzionare sicuramente con la versione 3.11.2. La versione 3.12.0 ti direbbe se è il modulo 'Array' o la funzione' make' in esso che non è associata, uno dei tanti piccoli miglioramenti apportati da questa versione, ma l'errore che stai ottenendo rimane un mistero. –

+2

@mktab È probabile che il file .../lib/ocaml/array.cmi non venga trovato dal compilatore. Forse manca o il pacchetto della distribuzione è stato preparato in modo improprio copiando i file in una destinazione diversa da quella in cui il compilatore è stato configurato per l'installazione. Se è il caso, è possibile correggerlo utilizzando le opzioni -I e -L, ma io consigliamo di ricompilare OCaml dai sorgenti. –

3

Ho trovato l'errore. È molto stupido. Ho salvato il mio file come "array.ml". Così durante la compilazione ha creato un file array.cmi e penso che abbia un po 'confuso questo file con quello trovato in .../lib/ocaml/array.cmi. Non sono veramente sicuro. Così ho rinominato il file in "table.ml" e lo ha compilato perfettamente. È assurdo che abbia confuso questi due file

+0

Come specificare esplicitamente '../ lib/ocaml/array.cmi', quindi? – updogliu