Hai perfettamente ragione: calcolare una funzione che restituisce nulla non ha senso, se parli di funzioni matematiche. Ma come in molti concetti matematici, le "funzioni" sono in molti linguaggi di programmazione solo relative alle funzioni matematiche, ma si comportano in modo più o meno sottilmente differente.
Credo sia opportuno spiegarlo con una lingua che fa non sbagliare: una di queste lingue è Haskell. È un linguaggio puramente funzionale, il che significa che una funzione Haskell è anche una funzione matematica. In effetti, è possibile scrivere le funzioni di Haskell in modo molto più matematico, ad es.
my_tan(x) = sin(x)/cos(x) -- or (preferred): tan' x = sin x/cos x
che in C++
double my_tan(double x) { return sin(x)/cos(x); }
Tuttavia, per i programmi informatici non si vuole solo per calcolare funzioni, vero? Volete anche fare delle cose, come visualizzare qualcosa sullo schermo, inviare dati attraverso la rete, leggere valori dai sensori, ecc. In Haskell, cose come queste sono ben separate dalle funzioni pure, agiscono tutte nel cosiddetto IO
monad. Ad esempio, la funzione putStrLn
, che stampa una riga di caratteri, ha tipo String -> IO()
.Significato, prende un argomento come String
e restituisce un'azione IO
che stampa quella stringa quando viene richiamata dalla funzione main
e nient'altro (i paren ()
sono approssimativamente ciò che è void
in C++).
Questo modo di fare IO ha molti vantaggi, ma la maggior parte dei linguaggi di programmazione sono più scrupoloso: permettono tutte funzioni di fare IO, e anche per cambiare lo stato interno del programma. Quindi, in C++, potresti semplicemente avere una funzione void putStrLn(std::string)
, che "restituisce" anche un'azione IO che stampa la stringa e nient'altro, ma non lo dice esplicitamente. Il vantaggio è che non hai bisogno di legare più nodi nel tuo cervello quando pensi a quello che è effettivamente il monade IO (è piuttosto rotonda). Inoltre, molti algoritmi possono essere implementati per funzionare più velocemente se si ha la capacità di dire effettivamente alla macchina "fai questa sequenza di processi, ora!" piuttosto che chiedere il risultato di qualche computazione nella monade IO.
Ci sono molte cose da fare per una funzione, oltre a restituire qualcosa ... –
Ti manca il concetto di [_side effects_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)). – ildjarn
Quella funzione non fa nulla, e molto probabilmente verrà rimossa quando compilato –