Pf con scala
Upcoming SlideShare
Loading in...5
×
 

Pf con scala

on

  • 1,448 views

 

Statistics

Views

Total Views
1,448
Views on SlideShare
344
Embed Views
1,104

Actions

Likes
0
Downloads
0
Comments
0

4 Embeds 1,104

http://rebeccasliter.com 616
http://localhost 486
http://cloud.feedly.com 1
http://rebeccasliter.com.netzcheck.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Hola! Me llamo Rebecca y soy desarolladora en ThoughtWorks. Estanocheyoquierohablar de la programaciónfuncional con Scala.
  • Peroprimeramente… queesScala?Scalautiliza el Maquina Virtual de Java. Puedencorrerlo en el JVM y utilizalasbibliotecas de Java en el código de Scala.
  • Scalatiene un tipadoestático. Vamos a hablar de eso unpoco mas tarde.
  • Scalaesorientado a objetos. Pero…..
  • Estacharlaessobre la programacianfuncional, no?Scalaesorientado a objetosporquetodos los valores son objetos. Scalaorganizasucompartamiento con clases; y, finalmente, puedeutilizarse con Java y C#-- dos lenguajesque son orientados a objetos.
  • Entonces,si. Scalaesorientado a objetos
  • PeroScalaestambíenfuncional.
  • Porestarazón, escomúnllamarestelenguajeobjeto-funcional.Estosignificaque el lenguajetienepropiedadesque lo hacenfuncional, peropuedencrearobjetosparaorganizarsucódigo.
  • Entonces, me gustariacentrarme enalgunascaracterísticasquehacenfuncional a un lenguaje.Y, particularmente, quehacefuncional a Scala.
  • Scalatienefunciones de orden superior.Estosignifica dos cosas:Los funciones de orden superior son funcionesquetienen OTRA funcióncomoparametro
  • Y, pues,lasfunciones de orden superior son funcionesqueretornanunafunción.
  • Comoaquí!(PAUSE)Aquí, tenemos un objeto, que se llama Almuerzo.Además del método main, Almuerzotiene dos metodos. Existe un métodoque se llama “apply.” apply tiene dos parametros: unafuncíon,”f”, y un Int.El método “apply” llama a su primer parametro, la funcíon, con el otro, el Int.
  • El método “main” dice que “apply” va a llamar a “entrada” con 50 como el segundoparametro.El resultadoestáabajo.
  • Scalatiene dos tipos de evaluación: perezosa y estricta. Evaluaciónestrictaes el default en Scala.Con evaluaciónestricta, necesitandeclararlasexpresiónes antes de utilizarlas.En esteejemplo, la variable, “b,” no esdeclarada antes de utilizarla. El compilador no sabesu valor, entonces, no puedeevaluarla.
  • Podemosutilizarevaluaciónperezosatambíen. Evaluaciónperezosaescomún en laprogramaciónfunciónalporqueesposiblecrearlaslistasinfinitivas sin preocuparsepor el tamaño.Evaluaciónperezosasignificaquelasexpresiónes no se evalúan hasta que se necesitan.En Scala, siqueremosutilizarevaluaciónperezosa, necesitamosutilizar la palabra “lazy.”Algunoslenguajes son “purosperezosos,” quesignificaquetodaslasevaluaciónes son en-demanda. Con Scala, podemosutilizarlas dos.
  • A vecesquierenpasaralgunosargumentos a unafunciónahora y algunosmástarde.Este concepto se llama “currying”Aquítenemosunafunciónque se llama “add”. Esimportantenotarque “add” tiene dos listas de parametros.
  • Cuandoqueremosañadir 5 y 6, porejemplo, podemospasar los argumentoscomoeso.Chevere, sí? Ahoraqueremoscrearotrafunción, “añadirdiez.”Y queremosutilizar la función add.
  • Aquíutilizamos la función add y un guiónbajoparaaplicarparcialmente el segundoargumento.
  • addTen solo tiene un argumento. NotanqueaddTenretorno un funciónqueva a tomar el segundoargumentocomo un argumento.
  • Scalatambiéntienemuchasfunciónesquienecambiotodos los miembros de unacolección. Estes son llamas combinadoresfuncionales.Map, porejemplo, ejecutaunafunción en unalista.
  • “Partition” puededividirunalista de acuerdo con un predicado.El valor de retornoes dos listas: unaque coincide con el predicado, y unaque no coincide con el predicado.
  • Scalatiene static typing,quepuedeser un aburrimiento.
  • Porsuerte, Scalatambiéntiene la inferencia de tiposparaciertascosas. Tipicamente, no esnecesarioespecificar el tipo de un variable. El tipo de retorno de métodostambiénpuedeserinferidopor el compilador.
  • Aquí, porejemplo, podemosdeclararque el tipo de “x” es un Int….Si queremos.
  • Pero no esnecesario, porqueScalatiene la inferencia de tipos.Aquí, porejemplo, el compiladorpuedeinferirque el tipo de “x” es un int.
  • Existealgunosmétodos en los que el compilador no puedeinferir el tipo de retorno.En los métodosrecursivos, porejemplo, el compilador no sabe lo quees el tipo de retorno.PAUSE
  • Porque el compilador no puedeinferir el tipo de retorno de método, necesitamosespecificareso.Existeotroscasos en lo quenecesitanespecificar el tipoqueesretorno, pero en general, van a tener un error descriptivosinecesitanespecificarle.
  • Si recuerden, Scala no es un lenguajequeespuramentefunciónal.
  • En realidad, el lenguajetienealgunaspropiedadesfuncionales, perotieneunaestructuraorientada al objetos.
  • Tuvimos unrecurso de lascosas en Scalaquéhacefunciónal al lenguaje.Entoncesyoquierohablar un poco de lo quéhaceorientado a objectos a Scala.
  • EnScala, un trait esunacoleccíon de fields y comportamientosquepuedenEXTEND o MIXIN a susclases.Los traits son muyfuertesporqueestán un métodoporcompartir el código-el comportamiento- común a través de susclases.
  • Aquí, tenemos un trait, “Pelicula,” quetiene solo un valor: un “String”
  • Cuandocreamos un clase, “Comedia,” podemosreutilizar la colección de comportamientosporunapelicula: el “trait” del Pelicula.
  • Podemos extend mas “traits” con la palabra, “with”En esteejemploutilizamos “pelicula” y “tiempo” en el clase, “comedia”
  • Finalmente, podemosorganizarsucódigo con los clases y traits en modules. Scalatienepatrónsparaorganizarcomoeso,peroesmuyfuerteparacrear el códigoqueesorganizado y reutilizable.

Pf con scala Pf con scala Presentation Transcript

  • Rebecca Sliter, ThoughtWorks @rebeccasliter con Scala
  • utiliza el JVM
  • static-typed utiliza el JVM
  • static-typed orientado a objetos utiliza el JVM
  • static-typed orientado a objetos? utiliza el JVM
  • static-typed orientado a objetos utiliza el JVM
  • static-typed funcional orientado a objetos utiliza el JVM
  • static-typed funcional orientado a objetos objeto-funcional utiliza el JVM
  • funcionalQué hace a este lenguaje?
  • Funciones de orden superior Funciones que tienen otra función como parametro
  • Funciones de orden superior Funciones que tienen otra función como parametro Funciones que retornan una función
  • Funciones de orden superior object Almuerzo { def main(args: Array[String]) { println( apply( postre, 50) ) } def apply(f: Int => String, v: Int) = f(v) def postre(x: Int) = “Comi “ + x.toString() + “ frutas.” }
  • Funciones de orden superior Comi 50 frutas. object Almuerzo { def main(args: Array[String]) { println( apply( postre, 50) ) } def apply(f: Int => String, v: Int) = f(v) def postre(x: Int) = “Comi “ + x.toString() + “ frutas.” }
  • Evaluación estricta scala> val a = b + 1; val b = 2; a: Int = 1 b: Int = 2
  • Evaluación estrictaperezosa scala> lazy val a = b + 1; lazy val b = 2; a: Int = <lazy> b: Int = <lazy> scala> a res1: Int = 3 scala> b res1: Int = 2
  • Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int
  • Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int scala> add(5)(6) res1: Int = 11
  • Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int scala> add(5)(6) res1: Int = 11 scala> val addTen = add(10)_ addTen: Int => Int = <function>
  • Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int scala> add(5)(6) res1: Int = 11 scala> val addTen = add(10)_ addTen: Int => Int = <function> scala> addTen(6) res2: Int = 16
  • Combinadores Funcionales scala> val numeros = List(1,2,3) numeros: List[Int] = List(1, 2, 3) scala> numeros.map((i: Int) => i * 3)) res1: List[Int] = List(3, 6, 9)
  • Combinadores Funcionales scala> val numeros = List(1,2,3) numeros: List[Int] = List(1, 2, 3) scala> numeros.partition(_ +1 == 3)) res1: (List[Int], List[Int]) = (List(2),List(1, 3))
  • Tipado estático
  • Tipado estático *la inferencia de tipos
  • Tipado estático *la inferencia de tipos scala> val x : Int = 1 + 2 x: Int = 3
  • Tipado estático *la inferencia de tipos scala> val x : Int = 1 + 2 x: Int = 3 scala> val x = 1 + 2 x: Int = 3
  • Cuando la inferencia no funciona… scala> def factorial(n: Int) = { | if (n == 0) 1 | else n * factorial(n – 1) | } <console>:1: error: recursive method factorial needs result type else n * factorial(n – 1) ^
  • Cuando la inferencia no funciona… scala> def factorial(n: Int) = { | if (n == 0) 1 | else n * factorial(n – 1) | } scala> def factorial(n: Int) : Int = { | if (n == 0) 1 | else n * factorial(n – 1) | } Factorial: (n: Int)Int
  • orientado a objetos funcional objeto-funcional
  • orientado a objetos objeto-funcional funcional
  • orientado a objetos Qué hace a este lenguaje?
  • Traits Colecciones de fields y comportamientos que pueden extend o mixin a sus clases.
  • trait Pelicula { val tipo: String } Traits
  • trait Pelicula { val tipo: String } class Comedia extends Pelicula { val tipo = “comedia” } Traits
  • trait Pelicula { val tipo: String } class Comedia extends Pelicula with Tiempo { val tipo = “comedia” val longitud = 90 } Traits trait Tiempo { val longitud: Int }
  • Modules
  • Recursos Scala docs: docs.scala-lang.org Simply Scala: simplyscala.com Scala School: twitter.github.io/scala_school $ sbt console