Podría ser instructivo ver esto en un entorno más general que sólo funciones que mapean algún tipo de número a otro tipo de número. Las funciones son una herramienta muy importante en la mayoría de los lenguajes de programación 1 donde a menudo se trabaja con datos mucho más complicados que los simples números 2 . Por ejemplo, en Haskell ,
f :: String -> Int
es una función que toma una cadena de caracteres (por ejemplo, "hullo") y produce un número entero. Esta función puede definirse como 3 como
f("How much is 5+6?") = 11
f("How many letters has the alphabet?") = 26
f("What is the answer to life, the universe, and everything?") = 42
f(x) = error("I haven't understood your question. You said: " ++ x)
En un intérprete interactivo, esto podría funcionar de la siguiente manera:
ghci> let f("How much is 5+6?") = 11; f("How many letters has the alphabet?") = 26; f("What is the answer to life, the universe, and everything?") = 42; f(x) = error("I haven't understood your question. You said: " ++ x)
ghci> f("What is the answer to life, the universe, and everything?")
42
ghci> f("How much is 5+6?")
11
ghci> f("How many years is my age?")
*** Exception: I haven't understood your question. You said: How many years is my age?
Sin embargo, si trato de definir la función de una manera que no es compatible con la firma de tipo 4 String -> Int
El intérprete se quejaría de inmediato.
ghci> let f :: String->Int; f("How do you write out '7'?") = "Seven."
<interactive>:16:56:
Couldn't match expected type `Int' with actual type `[Char]'
In the expression: "Seven."
In an equation for `f': f ("How do you write out '7'?") = "Seven."
porque "Seven."
A diferencia de 7
no es un número entero, sino una cadena de caracteres.
1 La mayoría de los lenguajes de programación son muy descuidados con su notación matemática, tienen funciones con "efectos secundarios", como imprimir algo en la pantalla o enviar un correo electrónico a alguien, lo que no tiene ningún sentido para las funciones matemáticas. En Haskell, esto está generalmente prohibido (tiene un truco de magia especial para hacer este tipo de cosas) excepto para los mensajes de error (que abortan todo el programa, por lo que la función no necesita molestarse en devolver un número en el cuarto caso).
2 Por supuesto, en matemáticas también se trabaja con datos mucho más complicados que los números, sólo que ese tipo de objetos son bastante más difíciles de entender que las cadenas de caracteres, creo.
3 Ten en cuenta que normalmente no necesitarías escribir todos esos paréntesis en Haskell, sólo los he usado para que parezca más familiar.
4 Lo que se llama "tipos" en los lenguajes de programación es casi (pero no del todo) lo mismo que el establece que se trata en las matemáticas.