Tiene toda la razón: calcular una función que no devuelve nada no tiene sentido, si se trata de funciones matemáticas. Pero al igual que con muchos conceptos matemáticos, las "funciones" se encuentran en muchos lenguajes de programación solo relacionados con funciones matemáticas, pero se comportan de manera más o menos sutilmente diferente.
Creo que es bueno explicarlo con un lenguaje que no hace no obténgalo mal: uno de esos idiomas es Haskell. Es un lenguaje puramente funcional que significa que una función Haskell también es una función matemática. De hecho, puede escribir las funciones de Haskell mucho más de estilo matemático, por ejemplo.
my_tan(x) = sin(x)/cos(x) -- or (preferred): tan' x = sin x/cos x
que en C++
double my_tan(double x) { return sin(x)/cos(x); }
Sin embargo, en los programas de ordenador que no sólo queremos calcular funciones, ¿verdad? También quiere hacer cosas, como mostrar algo en su pantalla, enviar datos a través de la red, leer valores de sensores, etc. En Haskell, cosas como estas están bien separadas de las funciones puras, todas actúan en el llamado IO
mónada. Por ejemplo, la función putStrLn
, que imprime una línea de caracteres, tiene el tipo String -> IO()
.Es decir, toma un String
como argumento y devuelve una acción IO
que imprime esa cadena cuando se invoca desde la función main
, y nada más (los parens ()
son aproximadamente lo que es void
en C++).
Esta forma de hacer IO tiene muchas ventajas, pero la mayoría de los lenguajes de programación son más descuidados: permiten todas las funciones para hacer IO, y también para cambiar el estado interno de su programa. Entonces en C++, simplemente podría tener una función void putStrLn(std::string)
, que también "devuelve" una acción IO que imprime la cadena y nada más, pero no se lo dice explícitamente. El beneficio es que no necesitas atar nudos múltiples en tu cerebro cuando piensas en qué es realmente la món IO (es más bien indirecta). Además, muchos algoritmos se pueden implementar para que funcionen más rápido si tiene la capacidad de decirle realmente a la máquina "¡Haga esta secuencia de procesos, ahora!" en lugar de solo pedir el resultado de algún cálculo en la mónada IO.
Hay un montón de cosas para una función para hacer, aparte de devolver algo ... –
Te estás perdiendo el concepto de [_side effects_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)) – ildjarn
Esa función no hace nada, y muy probablemente se eliminará cuando se compile –