{"id":7900,"date":"2023-03-01T08:02:26","date_gmt":"2023-03-01T07:02:26","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7900"},"modified":"2023-03-01T08:11:25","modified_gmt":"2023-03-01T07:11:25","slug":"01-mar-23","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/01-mar-23\/","title":{"rendered":"ChatGPT como profesor de programaci\u00f3n con Haskell"},"content":{"rendered":"<p>Se puede usar ChatGPT como profesor de programaci\u00f3n con Haskell, tal como se muestra en la siguiente conversaci\u00f3n.<\/p>\n<hr \/>\n<p><strong>Yo:<\/strong> Escribe solamente el enunciado de un ejercicio de programaci\u00f3n en Haskell, pero no escriba su soluci\u00f3n. Espera que yo escriba la soluci\u00f3n y corr\u00edgela.<\/p>\n<p><strong>ChatGPT:<\/strong> Escribe una funci\u00f3n en Haskell que tome una lista de n\u00fameros y devuelva una lista con los n\u00fameros elevados al cuadrado.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\nlistaDeCuadrados xs = [x^2 | x <- xs]\n<\/pre>\n<p><strong>ChatGPT:<\/strong> \u00a1Muy bien! La soluci\u00f3n que has proporcionado es correcta y eficiente. Esta funci\u00f3n utiliza una lista por comprensi\u00f3n, lo cual es una herramienta muy \u00fatil en Haskell. El c\u00f3digo es legible y f\u00e1cil de entender. \u00a1Buen trabajo!<\/p>\n<p><strong>Yo:<\/strong> Otro<\/p>\n<p><strong>ChatGPT:<\/strong> Escribe una funci\u00f3n en Haskell que tome dos listas y devuelva una lista con los elementos comunes a ambas listas.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\ncomunes xs ys = [x | x <- xs, x `elem` ys]\n<\/pre>\n<p><strong>ChatGPT:<\/strong> \u00a1Excelente! La soluci\u00f3n que has proporcionado es correcta. Esta funci\u00f3n utiliza una lista por comprensi\u00f3n y la funci\u00f3n elem para verificar si cada elemento de la primera lista tambi\u00e9n est\u00e1 en la segunda lista. El c\u00f3digo es f\u00e1cil de leer y entender. \u00a1Buen trabajo!<\/p>\n<p><strong>Yo:<\/strong> \u00bfC\u00f3mo se define por recursi\u00f3n?<\/p>\n<p><strong>ChatGPT:<\/strong> Claro, aqu\u00ed te muestro c\u00f3mo se podr\u00eda definir la funci\u00f3n comunes por recursi\u00f3n:<\/p>\n<pre lang=\"haskell\">\ncomunes :: Eq a => [a] -> [a] -> [a]\ncomunes [] _ = []\ncomunes (x:xs) ys\n  | x `elem` ys = x : comunes xs ys\n  | otherwise = comunes xs ys\n<\/pre>\n<p>En esta definici\u00f3n, la funci\u00f3n comunes tiene dos par\u00e1metros de tipo lista xs e ys. La funci\u00f3n utiliza la t\u00e9cnica de recursi\u00f3n para construir la lista de elementos comunes. La primera ecuaci\u00f3n es el caso base que se aplica cuando la lista xs es vac\u00eda. En este caso, la funci\u00f3n devuelve una lista vac\u00eda.<\/p>\n<p>En la segunda ecuaci\u00f3n, la funci\u00f3n comunes toma el primer elemento de  lista xs y comprueba si se encuentra en la lista ys utilizando la funci\u00f3n elem. Si el elemento est\u00e1 en la lista, se agrega a la lista de resultados y se llama a la funci\u00f3n recursivamente con el resto de la lista xs. Si el elemento no est\u00e1 en la lista, se llama a la funci\u00f3n recursivamente con el resto de la lista xs sin agregar el elemento a la lista de resultados.<\/p>\n<p>Espero que esto te haya ayudado a comprender c\u00f3mo definir esta funci\u00f3n por recursi\u00f3n en Haskell.<\/p>\n<p><strong>Yo:<\/strong> Escribe otro enunciado.<\/p>\n<p><strong>ChatGPT:<\/strong> Escribe una funci\u00f3n en Haskell que tome una lista de cadenas de caracteres y devuelva una lista con la longitud de cada cadena.<\/p>\n<p><strong>Yo:<\/strong><\/p>\n<pre lang=\"haskell\">\nlongitudes cs = [length c | c <- xs]\n<\/pre>\n<p><strong>ChatGPT:<\/strong> Tiene un peque\u00f1o error de variable en el c\u00f3digo que proporcionaste. La funci\u00f3n deber\u00eda ser as\u00ed:<\/p>\n<pre lang=\"haskell\">\nlongitudes cs = [length c | c <- cs]\n<\/pre>\n<p>La soluci\u00f3n es correcta y eficiente. Esta funci\u00f3n utiliza una lista por comprensi\u00f3n y la funci\u00f3n length para obtener la longitud de cada cadena de la lista de entrada. El c\u00f3digo es f\u00e1cil de entender y leer. \u00a1Buen trabajo!<\/p>\n<p><strong>Yo:<\/strong> \u00bfSe puede definir de forma m\u00e1s corta?<\/p>\n<p><strong>ChatGPT:<\/strong> S\u00ed, puedes utilizar una notaci\u00f3n de funci\u00f3n de orden  en Haskell para definir esta funci\u00f3n de manera m\u00e1s corta y elegante. La funci\u00f3n map en Haskell toma una funci\u00f3n y una lista como argumentos y aplica la funci\u00f3n a cada elemento de la lista, devolviendo una nueva lista con los resultados. Por lo tanto, la funci\u00f3n longitudes se puede definir de la siguiente manera utilizando la funci\u00f3n map:<\/p>\n<pre lang=\"haskell\">\nlongitudes = map length\n<\/pre>\n<p>Esta definici\u00f3n es m\u00e1s corta que la versi\u00f3n anterior y utiliza una notaci\u00f3n m\u00e1s elegante y funcional. La funci\u00f3n map aplica la funci\u00f3n length a cada elemento de la lista de entrada, y devuelve una nueva lista con las longitudes. \u00a1Muy bien!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se puede usar ChatGPT como profesor de programaci\u00f3n con Haskell, tal como se muestra en la siguiente conversaci\u00f3n. Yo: Escribe solamente el enunciado de un ejercicio de programaci\u00f3n en Haskell, pero no escriba su soluci\u00f3n. Espera que yo escriba la soluci\u00f3n y corr\u00edgela. ChatGPT: Escribe una funci\u00f3n en Haskell que tome una lista de n\u00fameros&#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\/7900"}],"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=7900"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7900\/revisions"}],"predecessor-version":[{"id":7903,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7900\/revisions\/7903"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}