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:...
Funciones de orden superior
Comi 50 frutas.
object Almuerzo {
def main(args: Array[String]) {
println( apply( postre, 50) ...
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 ...
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...
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...
Combinadores Funcionales
scala> val numeros = List(1,2,3)
numeros: List[Int] = List(1, 2, 3)
scala> numeros.map((i: Int) =...
Combinadores Funcionales
scala> val numeros = List(1,2,3)
numeros: List[Int] = List(1, 2, 3)
scala> numeros.partition(_ +1...
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)
| }
<consol...
Cuando la inferencia no funciona…
scala> def factorial(n: Int) = {
| if (n == 0) 1
| else n * factorial(n – 1)
| }
scala> ...
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
}
...
Modules
Recursos
Scala docs: docs.scala-lang.org
Simply Scala: simplyscala.com
Scala School: twitter.github.io/scala_school
$ sbt ...
Upcoming SlideShare
Loading in...5
×

Pf con scala

1,418

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,418
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

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.
  • Pf con scala

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

      Clipping is a handy way to collect important slides you want to go back to later.

    ×