{"id":5222,"date":"2015-12-16T12:12:33","date_gmt":"2015-12-16T11:12:33","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5222"},"modified":"2015-12-18T12:25:24","modified_gmt":"2015-12-18T11:25:24","slug":"i1m2015-programas-interactivos-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2015-programas-interactivos-en-haskell\/","title":{"rendered":"I1M2015: Programas interactivos y gr\u00e1ficas en Haskell"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-15\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se ha estudiado el <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m\/temas\/tema-13.html\">tema 13<\/a> sobre programas interativos.<\/p>\n<p>Se ha empezado observando un procedimiento que pide que se escriba una cadena y devuelve su longitud:<\/p>\n<pre lang=\"haskell\">\nlongitudCadena :: IO ()\nlongitudCadena = do\n  putStr \"Escribe una cadena: \"\n  xs <- getLine\n  putStr \"La cadena tiene \"\n  putStr (show (length xs))\n  putStrLn \" caracteres\"\n<\/pre>\n<p>A continuaci\u00f3n se han estudiado los elementos implicados en el procedimiento anterior: el tipo de las acciones de entrada\/salida (<code>IO<\/code>), las acciones b\u00e1sicas (<code>getChar<\/code>, <code>putChar<\/code> y <code>return<\/code>), la secuenciaci\u00f3n de acciones con <code>do<\/code> y la definici\u00f3n de algunos procedimientos del preludio (<code>getLine<\/code>, <code>putStr<\/code>, <code>putStrLn<\/code>, y <code>sequence_<\/code>).<\/p>\n<p>Como aplicaci\u00f3n se han estudiado dos programas:<\/p>\n<ol>\n<li><a href=\"http:\/\/bit.ly\/1QtYGSm\">programa para adivinar un n\u00famero<\/a> en sus dos versiones: cuando la m\u00e1quina tiene que adivinar el n\u00famero pensado por el humano y cuando es el humano el que tiene que adivinar el n\u00famero generado aleatoriamente por la m\u00e1quina.<\/li>\n<li>el <a href=\"http:\/\/bit.ly\/1QtYL8B\">juego de la vida<\/a>.<\/li>\n<\/ol>\n<p>Finalmente se ha estudiado <a href=\"http:\/\/bit.ly\/1QtYUsS\">c\u00f3mo representar gr\u00e1ficamente funciones con gnuplot<\/a>. Concretamente se ha visto<\/p>\n<ul>\n<li>c\u00f3mo instalar gnuplot (tanto el programa como la librer\u00eda de Haskell),<\/li>\n<li>c\u00f3mo importar la librer\u00eda con `import Graphics.Gnuplot.Simple,<\/li>\n<li>c\u00f3mo dibujar gr\u00e1fica de una funci\u00f3n (con <code>plotFunc<\/code>),<\/li>\n<li>como definir el rango de un gr\u00e1fica (con <code>linearScale<\/code>),<\/li>\n<li>c\u00f3mo modificar los atributos de una gr\u00e1fica (con <code>EPS<\/code>, <code>Grid<\/code>, <code>Title<\/code>, <code>Key<\/code> y <code>XLabel<\/code>),<\/li>\n<li>c\u00f3mo dibujar listas de puntos (con <code>plotList<\/code>),<\/li>\n<li>c\u00f3mo dibujar gr\u00e1ficas conjuntas de varias funciones (con <code>plotFuncs<\/code>),<\/li>\n<li>c\u00f3mo dibujar curvas param\u00e9tricas (con <code>plotParamFunc<\/code>) y<\/li>\n<li>c\u00f3mo dibujar superficies (con <code>plotFunc3d<\/code>).<\/li>\n<\/ul>\n<p>La documentaci\u00f3n de las funciones anteriores y otras funciones se encuentra en la p\u00e1gina de la librer\u00eda <a href=\"https:\/\/hackage.haskell.org\/package\/gnuplot-0.5.4\/docs\/Graphics-Gnuplot-Simple.html\">Graphics.Gnuplot.Simple<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se ha estudiado el tema 13 sobre programas interativos. Se ha empezado observando un procedimiento que pide que se escriba una cadena y devuelve su longitud: longitudCadena :: IO () longitudCadena = do putStr &#8220;Escribe una cadena: &#8221; xs<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","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":[250],"tags":[270,310],"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\/5222"}],"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=5222"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5222\/revisions"}],"predecessor-version":[{"id":5226,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5222\/revisions\/5226"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}