Este es el ejemplo que me convenció de aprender Haskell (y me alegro de haberlo hecho).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
Bien, es un programa breve y legible. En ese sentido, es mejor que un programa C. Pero, ¿en qué se diferencia esto de (digamos) un programa de Python con una estructura muy similar?
La respuesta es evaluación perezosa. En la mayoría de los lenguajes (incluso algunos funcionales), un programa estructurado como el anterior daría como resultado que todo el archivo se cargara en la memoria y luego se escribiera nuevamente con un nuevo nombre.
Haskell es "vago". No calcula las cosas hasta que lo necesita y, por extensión , no calcula las cosas que nunca necesita. Por ejemplo, si eliminara la writeFilelínea, Haskell no se molestaría en leer nada del archivo en primer lugar.
Tal como están las cosas, Haskell se da cuenta de que writeFiledepende de readFiley, por lo tanto, puede optimizar esta ruta de datos.
Si bien los resultados dependen del compilador, lo que suele suceder cuando ejecuta el programa anterior es lo siguiente: el programa lee un bloque (digamos 8 KB) del primer archivo, luego lo escribe en el segundo archivo y luego lee otro bloque del primero archivo y lo escribe en el segundo archivo, y así sucesivamente. (¡Intenta ejecutarlo strace!)
... que se parece mucho a lo que haría la implementación eficiente de C de una copia de archivo.
Por lo tanto, Haskell le permite escribir programas compactos y legibles, a menudo sin sacrificar mucho rendimiento.
Otra cosa que debo agregar es que Haskell simplemente dificulta la escritura de programas con errores. El asombroso sistema de tipos, la falta de efectos secundarios y, por supuesto, la compacidad del código Haskell reduce los errores por al menos tres razones:
Mejor diseño de programas. La complejidad reducida conduce a menos errores lógicos.
Código compacto. Menos líneas para que existan errores.
Compila errores. Muchos errores simplemente no son válidos para Haskell .
Haskell no es para todos. Pero todo el mundo debería intentarlo.