2011-06-15 21 views
8

Nel libro 'Sviluppo di applicazioni con OCaml', c'è la seguente spiegazione per quanto riguarda i valori di ritorno:OCaml valori di ritorno

Poiché il valore che precede un punto e virgola viene scartato, Objective CAML dà un avvertimento quando non è di digitare unità.

# print_int 1; 2 ; 3 ;; 
Characters 14-15: 
Warning: this expression should have type unit. 
1- : int = 3 


To avoid this message, you can use the 
function ignore: 

# print_int 1; ignore 2; 3 ;; 
1- : int = 3` 

non capisco il motivo per cui sarebbe un problema che ha un valore 2 diferent rendimento rispetto unit, perché la mia intenzione è di non tornare 2, ma per tornare 3. Per come la capisco, qualsiasi istruzione che preceda la mia ultima istruzione non è il valore di ritorno della funzione, quindi perché l'avviso?

Ho ricevuto questo avvertimento su tutto il mio codice e mi sta diventando chiaro che non capisco veramente come funzionano i valori di ritorno in OCaml.

Grazie per il vostro aiuto.

risposta

5

Prendere in considerazione l'espressione e1 ; e2. Per definizione, la valutazione dell'intera espressione comporta la valutazione di e1 e quindi e2 e il valore risultante dell'intera espressione è il valore di e2. Il risultato del valore di e1 è scartato. Questo non è il problema se il tipo di e1 è unit perché ha l'unico valore di singolo abitante (). Per tutti gli altri tipi, scartare il risultato di e1 significa perdere informazioni che probabilmente non sono ciò che il programmatore intendeva, quindi l'avviso. Il programmatore deve ignorare esplicitamente il valore del risultato, sia con ignore o con

let (_:type) = e1 in 
e2 

Tipo annotazione può essere omesso, ma può essere utile per essere sicuri che e1 sia pienamente valutata al tipo previsto (non un'applicazione parziale) .

+0

L'applicazione parziale comporterebbe un altro avviso :) – akoprowski

+0

Questa è una nota interessante sull'annotazione del tipo, probabilmente è qualcosa che non avrei mai considerato. –

+0

@akoprowski: no. 'let g() = lascia fxy = x + y in let _ = f 2 in f 1 2' – ygrek

4

Bene, l'avviso è lì perché il fatto che si produca un valore ma che poi non lo si usa potrebbe essere (e lo molto è spesso un'indicazione che stai facendo qualcosa di sbagliato. Se non si è d'accordo con questa politica, è possibile disattivare tale avviso. Ma come al solito è una buona pratica non farlo, nel qual caso, se davvero non hai bisogno di un valore di un'espressione, puoi effettivamente ignorarlo o legarlo a _, come in let _ = f() in ....