{"id":3955,"date":"2013-12-26T04:00:53","date_gmt":"2013-12-26T03:00:53","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3955"},"modified":"2013-12-26T05:49:32","modified_gmt":"2013-12-26T04:49:32","slug":"evaluacion-en-haskell-con-tiempo-acotado","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/evaluacion-en-haskell-con-tiempo-acotado\/","title":{"rendered":"Evaluaci\u00f3n en Haskell con tiempo acotado"},"content":{"rendered":"<p>A veces es interesante evaluar expresiones en Haskell durante un tiempo limitado. Se puede conseguir usando la funci\u00f3n <a href=\"http:\/\/hackage.haskell.org\/package\/base-4.6.0.1\/docs\/System-Timeout.html#v:timeout\">timeout<\/a> de la librer\u00eda <i>System.Timeout<\/i> y la <a href=\"http:\/\/hackage.haskell.org\/package\/base-4.6.0.1\/docs\/Control-Exception-Base.html#v:evaluate\">evaluate<\/a> de la <i>Control.Exception<\/i>.<\/p>\n<p>Vamos a mostrar su uso el siguiente ejemplo. En primer lugar, importamos las funciones<\/p>\n<pre lang=\"haskell\">\r\nimport System.Timeout (timeout)\r\nimport Control.Exception (evaluate)\r\n<\/pre>\n<p>A continuaci\u00f3n, definimos la funci\u00f3n de Fibonacci<\/p>\n<pre lang=\"haskell\">\r\nfib :: Int -> Int\r\nfib 0 = 1\r\nfib 1 = 1\r\nfib n = fib (n-1) + fib (n-2)\r\n<\/pre>\n<p>y la funci\u00f3n <i>acotada<\/i> tal que <i>(acotada t f x)<\/i> calcula <i>(f x)<\/i> durante <\/i>t<\/i> microsegundos (1\/10^6 segundos) y devuelve <i>(Just (f x))<\/i> si encuentra su valor o <i>Nothing<\/i> en caso contrario.<\/p>\n<pre lang=\"haskell\">\r\nacotada :: Int -> (a -> b) -> a -> IO (Maybe b)\r\nacotada t f x = timeout t (return $! f x)\r\n<\/pre>\n<p>Con <i>acotada<\/i> podemos realizar evaluaciones con tiempo limitado. Por ejemplo,<\/p>\n<pre lang=\"shell\">\r\nghci> acotada 100 fib 5\r\nJust 8\r\nghci> acotada 100 fib 20\r\nNothing\r\nghci> acotada (10^5) fib 20\r\nJust 10946\r\n<\/pre>\n<p>Tambi\u00e9n se puede acotar con <i>evaluate<\/i>. Por ejemplo,<\/p>\n<pre lang=\"shell\">\r\nghci> timeout 100 $ evaluate (fib 5)\r\nJust 8\r\nghci> timeout 100 $ evaluate (fib 20)\r\nNothing\r\nghci> timeout (10^5) $ evaluate (fib 20)\r\nJust 10946\r\n<\/pre>\n<p>Esta entrada se basa en la consulta <a href=\"http:\/\/stackoverflow.com\/questions\/20752083\/haskell-time-limit-on-evaluation\">Haskell time limit on evaluation<\/a> de StackOverflow.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A veces es interesante evaluar expresiones en Haskell durante un tiempo limitado. Se puede conseguir usando la funci\u00f3n timeout de la librer\u00eda System.Timeout y la evaluate de la Control.Exception. Vamos a mostrar su uso el siguiente ejemplo. En primer lugar, importamos las funciones import System.Timeout (timeout) import Control.Exception (evaluate) A continuaci\u00f3n, definimos la funci\u00f3n de&#8230;<\/p>\n","protected":false},"author":2,"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":[5,221],"tags":[270,299],"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\/3955"}],"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=3955"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3955\/revisions"}],"predecessor-version":[{"id":3959,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3955\/revisions\/3959"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}