Your SlideShare is downloading. ×
Pf con scala
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Pf con scala

1,381
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,381
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 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.
  • Transcript

    • 1. Rebecca Sliter, ThoughtWorks @rebeccasliter con Scala
    • 2. utiliza el JVM
    • 3. static-typed utiliza el JVM
    • 4. static-typed orientado a objetos utiliza el JVM
    • 5. static-typed orientado a objetos? utiliza el JVM
    • 6. static-typed orientado a objetos utiliza el JVM
    • 7. static-typed funcional orientado a objetos utiliza el JVM
    • 8. static-typed funcional orientado a objetos objeto-funcional utiliza el JVM
    • 9. funcionalQué hace a este lenguaje?
    • 10. Funciones de orden superior Funciones que tienen otra función como parametro
    • 11. Funciones de orden superior Funciones que tienen otra función como parametro Funciones que retornan una función
    • 12. 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.” }
    • 13. 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.” }
    • 14. Evaluación estricta scala> val a = b + 1; val b = 2; a: Int = 1 b: Int = 2
    • 15. 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
    • 16. Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int
    • 17. Currying scala> def add(a: Int)(b: Int) = a + b add: (a: Int)(b: Int)Int scala> add(5)(6) res1: Int = 11
    • 18. 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>
    • 19. 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
    • 20. 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)
    • 21. 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))
    • 22. Tipado estático
    • 23. Tipado estático *la inferencia de tipos
    • 24. Tipado estático *la inferencia de tipos scala> val x : Int = 1 + 2 x: Int = 3
    • 25. Tipado estático *la inferencia de tipos scala> val x : Int = 1 + 2 x: Int = 3 scala> val x = 1 + 2 x: Int = 3
    • 26. 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) ^
    • 27. 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
    • 28. orientado a objetos funcional objeto-funcional
    • 29. orientado a objetos objeto-funcional funcional
    • 30. orientado a objetos Qué hace a este lenguaje?
    • 31. Traits Colecciones de fields y comportamientos que pueden extend o mixin a sus clases.
    • 32. trait Pelicula { val tipo: String } Traits
    • 33. trait Pelicula { val tipo: String } class Comedia extends Pelicula { val tipo = “comedia” } Traits
    • 34. trait Pelicula { val tipo: String } class Comedia extends Pelicula with Tiempo { val tipo = “comedia” val longitud = 90 } Traits trait Tiempo { val longitud: Int }
    • 35. Modules
    • 36. Recursos Scala docs: docs.scala-lang.org Simply Scala: simplyscala.com Scala School: twitter.github.io/scala_school $ sbt console