{"id":7906,"date":"2023-03-03T08:46:40","date_gmt":"2023-03-03T07:46:40","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7906"},"modified":"2023-03-03T08:47:00","modified_gmt":"2023-03-03T07:47:00","slug":"03-mar-23","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/03-mar-23\/","title":{"rendered":"Pr\u00e1cticas sobre tipos algebraicos de datos en Haskell con ChatGPT"},"content":{"rendered":"<p>En un <a href=\"https:\/\/bit.ly\/3ERX02R\">art\u00edculo anterior<\/a> mostr\u00e9 el uso de ChatGPT como profesor de programaci\u00f3n en Haskell. Los ejercicios que propuso fueron muy simples, pero se puede elegir determinados tema para practicar; por ejemplo, tipos de datos algebraicos. En la siguiente conversaci\u00f3n se muestra c\u00f3mo puede hacerse (incluyendo alg\u00fan fallo por parte de ChatGPT).<\/p>\n<hr \/>\n<p><strong>Yo:<\/strong> Escribe solamente el enunciado de un ejercicio de programaci\u00f3n con Haskell sobre tipos algebraicos de datos, pero no escriba su respuesta. Espera que yo escriba la respuesta y corr\u00edgela.<\/p>\n<p><strong>ChatGPT:<\/strong> Aqu\u00ed est\u00e1 el enunciado del ejercicio:<\/p>\n<p>Escribe una definici\u00f3n de tipo algebraico de datos en Haskell para modelar una lista polim\u00f3rfica y luego implementa una funci\u00f3n que tome dos listas y las concatene en una sola lista. Aseg\u00farate de manejar correctamente los casos base y recursivos.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\ndata Lista a = Vacia | Cons a (Lista a)\n  deriving (Show, Eq)\n\nconcatenacion :: Lista a -> Lista a -> Lista a\nconcatenacion Vacia ys = ys\nconcatenacion (Cons x xs) ys = Cons x (concatenacion xs ys)\n<\/pre>\n<p><strong>ChatGPT:<\/strong> \u00a1Correcto! Tu respuesta es la soluci\u00f3n del ejercicio de programaci\u00f3n Haskell sobre tipos algebraicos de datos que propuse. Has definido un tipo algebraico de datos Lista que puede ser Vacia o un valor Cons que consiste en un valor de tipo a y una Lista adicional. Luego, has implementado una funci\u00f3n concatenacion que toma dos listas y las concatena en una sola lista utilizando la recursi\u00f3n y manejo adecuado de casos base. \u00a1Bien hecho!<\/p>\n<p><strong>Yo:<\/strong> Otro.<\/p>\n<p><strong>ChatGPT:<\/strong> \u00a1Por supuesto! Aqu\u00ed est\u00e1 el enunciado del ejercicio:<\/p>\n<p>Define un tipo algebraico de datos en Haskell para modelar una expresi\u00f3n aritm\u00e9tica que puede ser una suma, una resta, un producto o una divisi\u00f3n de dos expresiones aritm\u00e9ticas. Luego, implementa una funci\u00f3n que tome una expresi\u00f3n aritm\u00e9tica y calcule su resultado. Aseg\u00farate de manejar correctamente los casos base y recursivos y cualquier posible error de divisi\u00f3n por cero.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\ndata Expresion =\n    Suma Expresion Expresion\n  | Resta Expresion Expresion\n  | Producto Expresion Expresion\n  | Division Expresion Expresion\n  | Numero Float\n  deriving Show\n\nvalor :: Expresion -> Maybe Float\nvalor (Numero x) = Just x\nvalor (Suma x y) = (+) <$> valor x <*> valor y\nvalor (Resta x y) = (-) <$> valor x <*> valor y\nvalor (Producto x y) = (*) <$> valor x <*> valor y\nvalor (Division x y) = do\n    y' <- valor y\n    if y' == 0 then\n        Nothing\n    else\n        (\/) <$> valor x <*> Just y'\n<\/pre>\n<p><strong>ChatGPT:<\/strong> \u00a1Excelente trabajo! Tu soluci\u00f3n es correcta. Has definido un tipo algebraico de datos Expresion que puede ser una suma, resta, producto, divisi\u00f3n o un n\u00famero. Luego, has implementado una funci\u00f3n valor que toma una expresi\u00f3n aritm\u00e9tica y calcula su valor utilizando una combinaci\u00f3n de aplicaci\u00f3n parcial, m\u00f3nadas y manejando adecuadamente el posible error de divisi\u00f3n por cero mediante Maybe. \u00a1Muy bien hecho!<\/p>\n<p><strong>Yo:<\/strong> Otro.<\/p>\n<p><strong>ChatGPT:<\/strong> \u00a1Claro! Aqu\u00ed est\u00e1 el enunciado del ejercicio:<\/p>\n<p>Define un tipo algebraico de datos en Haskell para modelar un \u00e1rbol binario que puede ser un \u00e1rbol vac\u00edo o un nodo con un valor y dos sub-\u00e1rboles. Luego, implementa una funci\u00f3n que tome un \u00e1rbol binario y calcule su altura (es decir, la longitud del camino m\u00e1s largo desde la ra\u00edz hasta cualquier hoja). Aseg\u00farate de manejar correctamente los casos base y recursivos.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\ndata Arbol a =\n    Vacio\n  | Nodo a (Arbol a) (Arbol a)\n  deriving (Show)\n\naltura :: Arbol a -> Int\naltura Vacio = 0\naltura (Nodo _ izquierda derecha) = max (altura izquierda) (altura derecha)\n<\/pre>\n<p><strong>ChatGPT:<\/strong> \u00a1Correcto! Tu soluci\u00f3n es la soluci\u00f3n del ejercicio de programaci\u00f3n Haskell sobre tipos algebraicos de datos que propuse. Has definido un tipo algebraico de datos Arbol que puede ser un Vacio o un Nodo que contiene un valor y dos sub-\u00e1rboles. Luego, has implementado una funci\u00f3n altura que toma un \u00e1rbol binario y calcula su altura utilizando la recursi\u00f3n y manejando adecuadamente los casos base. \u00a1Muy bien hecho!<\/p>\n<p><strong>Yo:<\/strong> \u00bfNo falta sumar 1 en el caso recursivo?<\/p>\n<p><strong>ChatGPT:<\/strong> Tienes raz\u00f3n, \u00a1gracias por se\u00f1alarlo! En el caso recursivo de la funci\u00f3n altura, debemos sumar 1 al m\u00e1ximo de las alturas de los dos sub-\u00e1rboles, ya que el nodo actual tambi\u00e9n cuenta como una unidad de altura. Entonces, la soluci\u00f3n correcta ser\u00eda la siguiente:<\/p>\n<pre lang=\"haskell\">\naltura :: Arbol a -> Int\naltura Vacio = 0\naltura (Nodo _ izquierda derecha) = 1 + max (altura izquierda) (altura derecha)\n<\/pre>\n<p>De esta manera, la funci\u00f3n altura calcula correctamente la altura de un \u00e1rbol binario. \u00a1Gracias por la correcci\u00f3n!<\/p>\n<hr \/>\n","protected":false},"excerpt":{"rendered":"<p>En un art\u00edculo anterior mostr\u00e9 el uso de ChatGPT como profesor de programaci\u00f3n en Haskell. Los ejercicios que propuso fueron muy simples, pero se puede elegir determinados tema para practicar; por ejemplo, tipos de datos algebraicos. En la siguiente conversaci\u00f3n se muestra c\u00f3mo puede hacerse (incluyendo alg\u00fan fallo por parte de ChatGPT). Yo: Escribe solamente&#8230;<\/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":[1],"tags":[],"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\/7906"}],"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=7906"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7906\/revisions"}],"predecessor-version":[{"id":7907,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7906\/revisions\/7907"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}