Desarrollo del comando wc de Unix en Haskell
wc (en referencia a los términos ingleses “word count”) es un comando utilizado en el sistema operativo Unix que se utiliza para saber el número de palabras, líneas y caracteres de un fichero. Por ejemplo, si tenemos un fichero ciudades.txt cuyo contenido es
1 2 3 |
Sevilla, España Paris, Francia Munich, Alemania |
podemos contar con wc sus líneas, palabras y caracteres como sigue
1 2 3 4 5 6 |
> wc -l ciudades.txt 3 ciudades.txt > wc -w ciudades.txt 6 ciudades.txt > wc -m ciudades.txt 48 ciudades.txt |
En Haskell se pueden desarrollar programas simples con análogo comportamiento. Por ejemplo se puede contar las líneas del fichero como sigue
1 2 |
> runghc CuentaLineas.hs <ciudades.txt 3 |
El contenido del programa CuentaLineas.hs es simplemente
1 2 |
main = interact cuentaLineas where cuentaLineas entrada = show (length (lines entrada)) ++ "\n" |
En el ejemplo anterior se ha usado el commando runghc que permite ejecutar programas Haskell sin necesidad de compilarlo. Otra forma consiste en compilarlo
1 2 3 |
> ghc --make CuentaLineas.hs [1 of 1] Compiling Main ( CuentaLineas.hs, CuentaLineas.o ) Linking CuentaLineas ... |
y ejecutarlo
1 2 |
> ./CuentaLineas <ciudades.txt 3 |
En el programa CuentaLineas.hs se han usado las siguientes funciones de Haskell
- interact tal (interact f) escribe en la salida estándard el resultado de aplicar la función f a la cadena leida en la entrada estándard.
- lines tal que (lines c) es la lista de las líneas de la cadena c
- length tal que (length xs) es la longitud de la lista xs
- show tal que (show x) es la cadena correspondiente a la expresión x
Modificando el programa anterior se puede obtener otro para calcular el número de palabras de un fichero. Por ejemplo,
1 2 |
> runghc CuentaPalabras.hs <ciudades.txt 6 |
El programa CuentaPalabras.hs es
1 2 |
main = interact cuentaPalabras where cuentaPalabras entrada = show (length (words entrada)) ++ "\n" |
También modificando el programa anterior se puede obtener otro para calcular el número de caracteres de un fichero. Por ejemplo,
1 2 |
> runghc CuentaCaracteres.hs <ciudades.txt 48 |
El programa CuentaCaracteres.hs es
1 2 |
main = interact cuentaCaracteres where cuentaCaracteres entrada = show (length entrada) ++ "\n" |
Estos ejemplos ilustran cómo puede usarse Haskell para aplicaciones del mundo real. Muchas más aplicaciones se enecuentran en el libro de B. O’Sullivan, J. Goerzen y D. Stewart Real World Haskell.