{"id":852,"date":"2010-11-19T09:17:49","date_gmt":"2010-11-19T09:17:49","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=852"},"modified":"2013-03-08T05:50:08","modified_gmt":"2013-03-08T05:50:08","slug":"desarrollo-del-comando-wc-de-unix-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/desarrollo-del-comando-wc-de-unix-en-haskell\/","title":{"rendered":"Desarrollo del comando wc de Unix en Haskell"},"content":{"rendered":"<p>\n<a hef=\"http:\/\/es.wikipedia.org\/wiki\/Wc_%28Unix%29\">wc<\/a> (en referencia a los t\u00e9rminos ingleses &#8220;word count&#8221;) es un comando utilizado en el sistema operativo Unix que se utiliza para saber el n\u00famero de palabras, l\u00edneas y caracteres de un fichero. Por ejemplo, si tenemos un fichero <i>ciudades.txt<\/i> cuyo contenido es <\/p>\n<pre lang=\"shell\">\r\nSevilla, Espa\u00f1a\r\nParis, Francia\r\nMunich, Alemania\r\n<\/pre>\n<p>podemos contar con wc sus l\u00edneas, palabras y caracteres como sigue<\/p>\n<pre lang=\"shell\">\r\n> wc -l ciudades.txt \r\n3 ciudades.txt\r\n> wc -w ciudades.txt \r\n6 ciudades.txt\r\n> wc -m ciudades.txt \r\n48 ciudades.txt\r\n<\/pre>\n<p>\nEn Haskell se pueden desarrollar programas simples con an\u00e1logo comportamiento. Por ejemplo se puede contar las l\u00edneas del fichero como sigue<\/p>\n<pre lang=\"shell\">\r\n> runghc CuentaLineas.hs <ciudades.txt \r\n3\r\n<\/pre>\n<p>El contenido del programa <i>CuentaLineas.hs<\/i> es simplemente<\/p>\n<pre lang=\"haskell\">\r\nmain = interact cuentaLineas\r\n    where cuentaLineas entrada = show (length (lines entrada)) ++ \"\\n\"\r\n<\/pre>\n<p><!--more--><\/p>\n<p>\nEn el ejemplo anterior se ha usado el commando <a href=\"http:\/\/www.haskell.org\/ghc\/docs\/6.12.2\/html\/users_guide\/runghc.html\">runghc<\/a> que permite ejecutar programas Haskell sin necesidad de compilarlo. Otra forma consiste en compilarlo <\/p>\n<pre lang=\"shell\">\r\n> ghc --make CuentaLineas.hs \r\n[1 of 1] Compiling Main             ( CuentaLineas.hs, CuentaLineas.o )\r\nLinking CuentaLineas ...\r\n<\/pre>\n<p>y ejecutarlo<\/p>\n<pre lang=\"shell\">\r\n> .\/CuentaLineas <ciudades.txt \r\n3\r\n<\/pre>\n<p>\nEn el programa <i>CuentaLineas.hs<\/i> se han usado las siguientes funciones de Haskell<\/p>\n<ul>\n<li> <a href=\"http:\/\/haskell.org\/ghc\/docs\/6.12.1\/html\/libraries\/base-4.2.0.0\/Prelude.html#v%3Ainteract\">interact<\/a> tal <i>(interact f)<\/i> escribe en la salida est\u00e1ndard el resultado de aplicar la funci\u00f3n <i>f<\/i> a la cadena leida en la entrada est\u00e1ndard.\n<li> <a href=\"http:\/\/haskell.org\/ghc\/docs\/6.12.1\/html\/libraries\/base-4.2.0.0\/Prelude.html#v:lines\">lines<\/a> tal que <i>(lines c)<\/i> es la lista de las l\u00edneas de la cadena <i>c<\/i>\n<li> <a href=\"http:\/\/haskell.org\/ghc\/docs\/6.12.1\/html\/libraries\/base-4.2.0.0\/Prelude.html#v:length\">length<\/a> tal que <i>(length xs)<\/i> es la longitud de la lista <i>xs<\/i>\n<li> <a href=\"http:\/\/haskell.org\/ghc\/docs\/6.12.1\/html\/libraries\/base-4.2.0.0\/Prelude.html#v:show\">show<\/a> tal que <i>(show x)<\/i> es la cadena correspondiente a la expresi\u00f3n <i>x<\/i>\n<\/ul>\n<p>\nModificando el programa anterior se puede obtener otro para calcular el n\u00famero de palabras de un fichero. Por ejemplo,<\/p>\n<pre lang=\"shell\">\r\n> runghc CuentaPalabras.hs <ciudades.txt \r\n6\r\n<\/pre>\n<p>El programa <i>CuentaPalabras.hs<\/i> es<\/p>\n<pre lang=\"haskell\">\r\nmain = interact cuentaPalabras\r\n    where cuentaPalabras entrada = show (length (words entrada)) ++ \"\\n\"\r\n<\/pre>\n<p>\nTambi\u00e9n modificando el programa anterior se puede obtener otro para calcular el  n\u00famero de caracteres de un fichero. Por ejemplo,<\/p>\n<pre lang=\"shell\">\r\n> runghc CuentaCaracteres.hs <ciudades.txt \r\n48\r\n<\/pre>\n<p>El programa <i>CuentaCaracteres.hs<\/i> es<\/p>\n<pre lang=\"haskell\">\r\nmain = interact cuentaCaracteres\r\n    where cuentaCaracteres entrada = show (length entrada) ++ \"\\n\"\r\n<\/pre>\n<p>Estos ejemplos ilustran c\u00f3mo puede usarse Haskell para aplicaciones del mundo real. Muchas m\u00e1s aplicaciones se enecuentran en el libro de B. O'Sullivan, J. Goerzen y D. Stewart <a href=\"http:\/\/goo.gl\/Pvd3\">Real World Haskell<a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>wc (en referencia a los t\u00e9rminos ingleses &#8220;word count&#8221;) es un comando utilizado en el sistema operativo Unix que se utiliza para saber el n\u00famero de palabras, l\u00edneas y caracteres de un fichero. Por ejemplo, si tenemos un fichero ciudades.txt cuyo contenido es Sevilla, Espa\u00f1a Paris, Francia Munich, Alemania podemos contar con wc sus l\u00edneas,&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[5],"tags":[270],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/852"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=852"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/852\/revisions"}],"predecessor-version":[{"id":2982,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/852\/revisions\/2982"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}