2011-10-08 13 views
6

Al toplevel di OCaml (versione 3.11.2), questa semplice espressione mi sta dando un errore:ocaml null keyword: una volta ma non di più?

# let a = [] in if null a then 0 else 1;; 
Error: Unbound value null 

Ho appena iniziato l'apprendimento ocaml dal oreilly book, che sembra utilizzare null come parola chiave di frequente - per parte superiore della pagina 32:

# let rec size a_list = 
    if null a_list then 0 
    else 1 + (size (List.tl a_list));; 

Sono imbarazzato per fare una domanda così chiaramente googleable qui. Ma dopo molti googling sono arrivato a mani vuote. Quindi sono aperto a suggerimenti di query su google come lo sono per risposte semplici. (tentativi google falliti: [ocaml "Errore: valore non associato null"] [parola chiave ocaml null] [ocaml changelog null] [ocaml change null]).

Domanda: era null una volta una parola chiave ocaml, ma non più? O ho installato ocaml errato o misspell qualcosa?

Posso ovviamente sostituire ogni occorrenza di "null" con "[]" nel codice, ma sono sorpreso che una copia letterale del codice di un libro mi dà un errore così presto. Questo libro è pieno di altri trucchi? Credo che sia stato scritto con ocaml 2.04 in mente; è troppo vecchio? L'ho scelto perché mi piaceva il TOC e la disponibilità gratuita online. A parte questo errore nullo (che sono ancora più pronto a incolpare me stesso che sugli autori), le spiegazioni sono belle e non vedo l'ora di discutere sulla miscelazione funzionale dello stile imperativo & (che per me è in espansione, come qualcuno solo familiare con c/C++).

+0

[Questa domanda] (http://stackoverflow.com/questions/4013654/differences-between-ocaml-2-and-3) affronta cambiamenti tra la versione 2 e 3, e link a un changelog; nessuno di questi menziona la cosa nulla. In effetti il ​​libro che ho linkato nella mia Q è menzionato dall'OP e raccomandato da qualcuno che risponde alla domanda. Probabilmente commenterò su quel thread dopo aver capito cosa sta succedendo qui. – ImAlsoGreg

+2

Non ero a conoscenza del fatto che 'null' era sempre una parola chiave. Sei sicuro che non sia solo una funzione che hanno definito ad un certo punto? AFAIK, non esiste tale nozione di 'null' in un vero linguaggio funzionale. Probabilmente la cosa più vicina sarebbe l'unità ('()'). –

+0

Hai ragione! Ho cercato il mio pdf per "let null =" e sicuramente, è qualcosa definito nel libro. Grazie mille per averlo chiarito. Ora la meta-domanda è - la domanda dovrebbe essere lasciata sul posto per le persone che fanno lo stesso stupido errore come me più tardi? – ImAlsoGreg

risposta

9

nulla è definito nel libro a pagina 31. E 'una funzione normale che si può definire se stessi:

let null l = (l = []) 

Questa nomenclatura è più o meno basato sul Lisp, dove NIL è un elenco vuoto (anche scritto as()) e NULL è un predicato (una funzione che restituisce true o false), esattamente come null sopra.

2

OCaml fornisce potente Pattern Matching, che consente di definire la funzione più essere letti:

let rec size a_list = match a_list with 
| [] -> 0 
| _ :: tl -> 1 + (size tl) 

Come pattern matching viene spesso eseguita su l'ultimo argomento, una notazione speciale è disponibile:

let rec size = function 
| [] -> 0 
| _ :: tl -> 1 + (size tl) 

null può essere definito più breve utilizzando (=) (ovvero, il test per l'uguaglianza come funzione normale/prefisso):

let null = (=) [] 
Problemi correlati