{"id":3186,"date":"2017-04-05T06:00:01","date_gmt":"2017-04-05T04:00:01","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3186"},"modified":"2017-04-12T10:20:15","modified_gmt":"2017-04-12T08:20:15","slug":"agrupamiento-segun-valores","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/agrupamiento-segun-valores\/","title":{"rendered":"Agrupamiento seg\u00fan valores"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   agrupa :: Ord c => (a -> c) -> [a] -> Map c [a]\n<\/pre>\n<p>tal que (agrupa f xs) es el diccionario obtenido agrupando los elementos de xs seg\u00fan sus valores mediante la funci\u00f3n f. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ghci> agrupa length [\"hoy\", \"ayer\", \"ana\", \"cosa\"]\n   fromList [(3,[\"hoy\",\"ana\"]),(4,[\"ayer\",\"cosa\"])]\n   ghci> agrupa head [\"claro\", \"ayer\", \"ana\", \"cosa\"]\n   fromList [('a',[\"ayer\",\"ana\"]),('c',[\"claro\",\"cosa\"])]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport qualified Data.List as L\nimport Data.Map\n\n-- 1\u00aa definici\u00f3n (por recursi\u00f3n)\nagrupa1 :: Ord c => (a -> c) -> [a] -> Map c [a]\nagrupa1 _ []     = empty\nagrupa1 f (x:xs) = insertWith (++) (f x) [x] (agrupa1 f xs)\n\n-- 2\u00aa definici\u00f3n (por plegado)\nagrupa2 :: Ord c => (a -> c) -> [a] -> Map c [a]\nagrupa2 f = L.foldr (\\x -> insertWith (++) (f x) [x]) empty\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n agrupa :: Ord c => (a -> c) -> [a] -> Map c [a] tal que (agrupa f xs) es el diccionario obtenido agrupando los elementos de xs seg\u00fan sus valores mediante la funci\u00f3n f. Por ejemplo, ghci> agrupa length [\u00abhoy\u00bb, \u00abayer\u00bb, \u00abana\u00bb, \u00abcosa\u00bb] fromList [(3,[\u00abhoy\u00bb,\u00bbana\u00bb]),(4,[\u00abayer\u00bb,\u00bbcosa\u00bb])] ghci> agrupa head [\u00abclaro\u00bb, \u00abayer\u00bb, \u00abana\u00bb,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","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":[4],"tags":[290,291,94,293,11,6],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3186"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=3186"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3186\/revisions"}],"predecessor-version":[{"id":3215,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3186\/revisions\/3215"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}