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
}
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.