{"id":152,"date":"2023-04-21T03:54:31","date_gmt":"2023-04-21T03:54:31","guid":{"rendered":"https:\/\/canessaalvamiguel.dev\/?p=152"},"modified":"2023-04-21T03:54:31","modified_gmt":"2023-04-21T03:54:31","slug":"partial-functions-in-scala","status":"publish","type":"post","link":"https:\/\/canessaalvamiguel.dev\/index.php\/2023\/04\/21\/partial-functions-in-scala\/","title":{"rendered":"Partial functions in Scala"},"content":{"rendered":"\n<p>En Scala, una funci\u00f3n parcial (partial function) es una funci\u00f3n que solo est\u00e1 definida para un subconjunto de valores de entrada posibles. Por ejemplo, la funci\u00f3n <code>sqrt<\/code> est\u00e1 definida solo para n\u00fameros positivos, y si se le pasa un n\u00famero negativo, lanzar\u00e1 una excepci\u00f3n. Podemos definir una funci\u00f3n parcial que maneje solo los n\u00fameros positivos de esta manera:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval sqrt: PartialFunction&#x5B;Double, Double] = {\n  case x if x &gt;= 0 =&gt; Math.sqrt(x)\n}\n\n\/\/ Ejemplo de uso de la funci\u00f3n parcial\nsqrt(4) \/\/ devuelve 2.0\nsqrt(-4) \/\/ lanza una excepci\u00f3n\n<\/pre><\/div>\n\n\n<p>En este ejemplo, definimos una funci\u00f3n parcial <code>sqrt<\/code> que toma un <code>Double<\/code> como entrada y devuelve otro <code>Double<\/code>. La sintaxis <code>case x if x &gt;= 0 =&gt; Math.sqrt(x)<\/code> define el comportamiento de la funci\u00f3n para los valores de entrada que son mayores o iguales a cero. La funci\u00f3n solo est\u00e1 definida para estos valores y lanzar\u00e1 una excepci\u00f3n si se le pasa un valor negativo.<\/p>\n\n\n\n<p>Para definir una funci\u00f3n parcial en Scala, usamos la clase <code>PartialFunction[A, B]<\/code>, donde <code>A<\/code> es el tipo de entrada y <code>B<\/code> es el tipo de salida. Dentro de la clase <code>PartialFunction<\/code>, definimos una serie de casos que manejan diferentes valores de entrada.<\/p>\n\n\n\n<p>Podemos usar la funci\u00f3n parcial <code>isDefinedAt<\/code> para verificar si la funci\u00f3n est\u00e1 definida para un valor de entrada determinado:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsqrt.isDefinedAt(4) \/\/ devuelve true\nsqrt.isDefinedAt(-4) \/\/ devuelve false\n<\/pre><\/div>\n\n\n<p>Tambi\u00e9n podemos combinar varias funciones parciales en una sola funci\u00f3n usando el m\u00e9todo <code>orElse<\/code>. Por ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nval reciprocal: PartialFunction&#x5B;Double, Double] = {\n  case x if x != 0 =&gt; 1 \/ x\n}\n\nval totalFunction = sqrt.orElse(reciprocal)\n\ntotalFunction(4) \/\/ devuelve 2.0\ntotalFunction(0) \/\/ lanza una excepci\u00f3n\ntotalFunction(-4) \/\/ devuelve -0.25\n<\/pre><\/div>\n\n\n<p>En este ejemplo, definimos una segunda funci\u00f3n parcial <code>reciprocal<\/code> que toma un <code>Double<\/code> como entrada y devuelve otro <code>Double<\/code>. Esta funci\u00f3n est\u00e1 definida para cualquier valor de entrada que no sea cero. Luego, usamos el m\u00e9todo <code>orElse<\/code> para combinar <code>sqrt<\/code> y <code>reciprocal<\/code> en una sola funci\u00f3n llamada <code>totalFunction<\/code>. Si <code>sqrt<\/code> no puede manejar el valor de entrada, <code>totalFunction<\/code> intentar\u00e1 usar <code>reciprocal<\/code> en su lugar.<\/p>\n\n\n\n<p>En resumen, las funciones parciales son una herramienta \u00fatil para manejar casos especiales o excepciones en una funci\u00f3n. En lugar de lanzar una excepci\u00f3n, podemos definir una funci\u00f3n parcial que maneje los valores de entrada especiales de manera segura y elegante.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Scala, una funci\u00f3n parcial (partial function) es una funci\u00f3n que solo est\u00e1 definida para un subconjunto de<\/p>\n","protected":false},"author":1,"featured_media":62,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[33,8],"class_list":["post-152","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scala","tag-partial-functions","tag-scala"],"_links":{"self":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/152","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/comments?post=152"}],"version-history":[{"count":1,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/152\/revisions"}],"predecessor-version":[{"id":153,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/152\/revisions\/153"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media\/62"}],"wp:attachment":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media?parent=152"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/categories?post=152"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/tags?post=152"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}