2012-04-04 14 views
8

Ho una funzione che restituisce [[]] e voglio testare il risultato come test unitario. Ma ho trovato che l'espressione [[]] == [[]] restituisce false. Ecco un semplice codice di prova:Espressione booleana OCaml [[]] == [[]]

# [[]] == [[]];; 
- : bool = false 

Qualcuno mi può spiegare perché questa espressione viene valutata come falsa?

Grazie.

+0

C'è più informazioni sull'uguaglianza strutturale e fisica in un'altra domanda, http://stackoverflow.com/questions/1412668/does-have-meaning-in-oca ml/ – nlucaroni

risposta

13

Usa = poiché avete uguaglianza strutturale per confrontare due valori:

# [[]] = [[]];; 
- : bool = true 

Perché == è uguaglianza di riferimento, restituisce vero solo se si fa riferimento alla stessa posizione di memoria:

let a = [[]] 
let b = a 

# b == a;; 
- : bool = true 
9

L'operatore == in OCaml significa "uguaglianza fisica". Tuttavia, hai due (fisicamente) elenchi diversi. Probabilmente, vuoi "uguaglianza strutturale", che è testato da =.

+0

Ok ho capito subito. Ma significa che il primo [[]] è 'un elenco di liste e il secondo' elenco di b list? – Atikae

+1

Sì, ogni '[]' assegna una nuova lista (cf http://www.cs.jhu.edu/~scott/pl/lectures/caml-intro.html), ma entrambe le liste non sono * identiche * elenco. – Matthias

+1

'[]' ha l'uguaglianza strutturale e fisica (è simile a un intero). Non alloca una nuova lista. Sono le parentesi esterne che stanno creando il nuovo elenco, dal momento che '[[]] = ([] :: [])'. – nlucaroni