SlideShare una empresa de Scribd logo
Introducción a Scala 
Jose Emilio Labra Gayo 
Depto. Informática 
Universidad de Oviedo
Scala 
Creado en 2003 por Martin Odersky 
Lenguaje Funcional y Orientado a Objetos 
Tipado estático 
Influencias: Java, Haskell 
Compila a JVM 
Martin Odersky, 
Fuente: http://lampwww.epfl.ch/~odersky/ 
Object Oriented meets Functional. 
Have the best of both worlds
Ecosistema 
Página: https://www.scala-lang.org 
Implementaciones: 
Scala (compila a JVM), ScalaJS (compila a Javascript) 
Versiones en funcionamiento: 
2.9 (2011), 2.10 (2013) , 2.11 (2014) 
Intérprete: scala Compilador: scalac 
Construcción: sbt (http://www.scala-sbt.org) 
Búsqueda: http://scalex.org/ 
Documentación: http://docs.scala-lang.org/
Hola Mundo en Scala 
object Saluda { 
def main(args: Array[String]) = 
println("Hola desde Scala!") 
} 
holaMundo.scala 
Varias formas de ejecutarlo: 
Intérprete: scala 
Compilador: scalac 
> scala holaMundo.scala 
Hola desde Scala! 
> scalac holaMundo.scala 
> scala holaMundo 
Hola desde Scala!
Conceptos básicos 
Lenguaje funcional y Orientado a Objetos 
Diferencia entre valores y variables 
val x = 5 //> x : Int = 5 
println(x) //> 5 
x = x + 1 //> error: reassignment to val 
var x = 6 //> x : Int = 6 
x = x + 1 
println(x) //> 7
Chequeo e inferencia de Tipos 
Chequeo estático de tipos 
Tiempo de compilación 
Objetivo: Si compila, entonces no hay error de tipos 
Sistema de inferencia de tipos 
Muchas declaraciones de tipos = opcionales 
Si se declara, se comprueba que está bien 
val x: Int = 2 + 3 //> x : Int = 5 
val y = 2 + 3 //> y : Int = 5 
val z: Boolean = 2 + 3 //> error: type mismatch; 
found : Int(5) 
required: Boolean
Sintaxis básica 
Nombres de variabes similar a Java 
Bloque de sentencias entre { } y separados por ; 
Valor del bloque = valor de último elemento 
Un bloque es una expresión
Sintaxis básica 
Las sentencias tienen un ; al final 
Pero en muchas ocasiones puede omitirse 
El Sistema lo infiere 
{ val x = 3 
x + x 
} 
{ val x = 3 ; 
x + x 
} 
≡ 
NOTA: A veces se producen mensajes de error extraños (unexpected ;) 
Cuidado con expresiones del tipo: 
val prueba = uno + 
dos 
val prueba = uno + dos ; 
val prueba = uno 
+ dos 
val prueba = uno ; 
+ dos ;
Ámbito de variables 
Variables locales 
Definiciones en un bloque sólo visibles dentro de él 
Definiciones en un bloque tapan definiciones externas 
val x = 3 
def f(x: Int) = x + 1 
val resultado = { 
val x = f(3) 
x * x 
} + x 
println(resultado) //> ??? ¿Qué imprime?
Sintaxis básica 
Todo son expresiones 
val mensaje = if (edad > 18) "Puede votar" 
else "Es menor" 
Numerosas simplificaciones 
( ) opcionales con métodos de 0 ó 1 argumento 
2 + 3 == 2.+(3) 
. opcional (operador posfijo) 
juan.saluda() 
juan.saluda 
juan saluda 
juan.saluda("Pepe") 
juan saluda("pepe") 
juan saluda "pepe"
Sintaxis básica 
Declaraciones de tipo después de variable 
Java Scala 
Integer x = 0; val x: Int = 0 
Java Scala 
Integer suma(Integer a, Integer b) { 
return a + b; 
} 
def suma(x:Int, y:Int) = x + y 
No es necesario return
ScalaTest 
Crear los siguientes métodos 
par(n) compruebe si un número es par 
fact(n) devuelve el factorial de un nº 
Pasos a seguir: 
Descargar/clonar: https://github.com/cursosLabra/EjerciciosScala 
Contiene una plantilla con la estructura de directories 
Pruebas mediante ScalaTest 
Utilizar SBT (Simple Build Tool) 
> sbt test 
ScalaTest de Factorial 
https://gist.github.com/labra/2c16ad44ac484d0271d6
Objetos y clases 
Herencia universal de Object 
No hay tipos primitivos 
Int, Boolean, Float, Double, etc = clases 
Object 
AnyVal AnyRef 
Int Long Double ... String List ... 
Nothing/Null
Declaración de Objetos 
object permite definir objetos singleton 
object juan { 
var edad = 34 
val nombre = "Juan Manuel" 
def crece() { this.edad += 1 } 
def getEdad():Int = this.edad 
def masViejo(otro: { def getEdad(): Int}) = 
this.edad > otro.getEdad 
} 
NOTA 
Scala es un lenguaje basado en clases 
En realidad, object crea un objeto singleton de una clase Juan
Clases: Estilo imperativo 
Mediante class 
class Persona(nombre: String, var edad: Int) { 
def crece(): Unit { 
this.edad += 1 
} 
def masViejo(otro: Persona): Boolean = { 
this.edad > otro.getEdad 
} 
def getEdad() = edad 
} 
val juan = new Persona("Juan Manuel", 34) 
juan.crece 
println (juan.getEdad) //> 35 
val pepe = new Persona("Jose Luis", 22) 
println(pepe.masViejo(juan)) //> false 
Objetos mutables 
edad es una 
variable que se 
actualiza
Clases: Estilo funcional 
Objetos inmutables 
Operaciones de escritura devuelven nuevos objetos 
class Persona(nombre: String, edad: Int) { 
def crece(): Persona = { 
new Persona(nombre, this.edad + 1) 
} 
def masViejo(otro: Persona): Boolean = { 
this.edad > otro.getEdad 
} 
def getEdad() = edad 
} 
val juan = new Persona("Juan Manuel", 34) 
println (juan.getEdad) //> 34 
val juan1 = juan.crece 
println (juan1.getEdad) //> 35 
println (juan.getEdad) //> 34
Herencia 
Mediante extends 
class Usuario(nombre: String, 
edad:Int, 
email: String) extends Persona(nombre,edad) { 
def login(email: String): Boolean = { 
this.email == email 
} 
} 
def sumaEdades(personas:List[Persona]): Int = { 
personas.map(_.getEdad).sum 
} 
val juan = new Persona("Juan", 34) 
val luis = new Usuario("Luis", 20, "luis@mail.com") 
println(sumaEdades(List(juan,luis))) //> 54
Ejercicio: Figuras 
Crear una clase Figura con 2 atributos (x,y) 
Método que permita mover la figura 
Crear una clase Rect para representar Rectángulos 
Atributos a (ancho) y b (altura) 
Crear una clase Circulo para representar Círculos 
Atributo r (radio) 
Crear método area para calcular el area 
Crear método areas que calcula el area de una lista de figuras 
https://gist.github.com/labra/170a570f49922fd5281c
Estructuras de control 
if 
match 
while 
for, foreach 
try
Estructuras de control 
if es similar a otros lenguajes 
Devuelve un valor 
val mensaje = 
if (edad >= 18) "Puede votar" 
else "Es menor"
While, do...while 
Similares a Java def mcd(x:Int,y:Int):Int = { 
var a = x 
var b = y 
while(a != 0) { 
val temp = a 
a = b % a 
b = temp 
} 
b 
} 
NOTA: Los bucles While suelen ser imperativos. 
Pueden re-escribirse mediante recursividad 
def mcd(x:Int,y:Int):Int = { 
if (x == 0) y 
else mcd(y % x,x) 
}
Bucles While e iteradores 
Estilo imperativo 
def mediaEdad(personas: List[Persona]): Double = { 
var suma = 0 
val it = personas.iterator 
while (it.hasNext) { 
val persona = it.next() 
suma += persona.edad 
} 
suma / personas.length 
} 
NOTA: Puede re-escribirse con estilo funcional: 
def mediaEdad(personas: List[Persona]): Double = { 
personas.map(_.edad).sum / personas.length 
}
Encaje de patrones 
Expresión match 
dia match { 
case "Sabado" => println("Fiesta") 
case "Domingo" => println("Dormir") 
case _ => println("Programar en Scala") 
} 
Expresión match devuelve un valor 
val mensaje = dia match { 
case "Sabado" => "Fiesta" 
case "Domingo" => "Dormir" 
case _ => "Programar en Scala" 
}
Bucles for 
Contienen: 
Generadores (suelen ser colecciones) 
Filtros (condiciones) 
yield: Valores que se devuelven 
def pares(m:Int,n:Int): List[Int] = 
for (i <- List.range(m,n) if i % 2 == 0) yield i 
println(pares(0,10)) //> List(0,2,4,6,8,10) 
Si no hay yield se devuelve Unit 
Similar a bucles convencionales de otros lenguajes 
for (i <- 1 to 4) 
print("x" + i) //> x1 x2 x3 x4
Excepciones 
try...throw...catch...similar a Java 
def divide(m:Int, n:Int) : Int = { 
if (n == 0) 
throw new RuntimeException("division por 0") 
else m / n 
} 
try { 
println("5/4 = " + divide(5,4)) 
println("5/0 = " + divide(5,0)) 
} catch { 
case e: Exception => println("Error: " + e.getMessage) 
} finally { 
println("Fin") 
} 
5/4 = 1 
Error: division por 0 
Fin
Clase Option 
Option permite definir funciones parciales 
Puede utilizarse para evitar uso de excepciones 
def divide(m:Int, n:Int) : Option[Int] = { 
if (n == 0) 
None 
else 
Some(m / n) 
} 
println("5/4 = " + divide(5,4)) //> Some(1) 
println("5/0 = " + divide(5,0)) //> None 
NOTA: La clase Try puede también utilizarse.
Ejercicio 
Calcular los factores primos de un número 
Ejemplo: 
factores 1 = [1] 
factores 2 = [1,2] 
factores 3 = [1,3] 
factores 4 = [1,2,2] 
factores 5 = [1,5] 
factores 6 = [1,2,3] 
... 
https://gist.github.com/labra/270a37314524db303f7c
Funciones en Scala 
Varias formas de declarar funciones 
def suma(x:Int,y:Int) = x + y 
def suma(x:Int,y:Int): Int = x + y 
def suma(x:Int,y:Int): Int = { 
return x + y 
} 
Procedimiento = función que devuelve valor de tipo Unit 
def suma3(x:Int,y:Int) { 
println(x + y) 
} 
def suma4(x:Int,y:Int):Unit = { 
println(x + y) 
}
Programación funcional 
Funciones como valores 
val suma = (x:Int,y:Int) => x + y 
Funciones de orden superior 
def suma3(x:Int) = x + 3 
def aplica2(f: Int => Int, x: Int) = f(f(x)) 
println(aplica2(suma3,2)) //> 8 
println(aplica2((x:Int) => x * x,2)) //> 16
Tipos predefinidos 
Numéricos: Int, BigInt, Float, Double 
Boolean 
String 
Rangos 
Tuplas 
Regex 
Null 
Any, AnyVal, AnyRef
Números, booleanos y caracteres 
Similares a Java pero sin tipos primitivos 
Byte, Short, Int, Long, Float, Double 
Rango disponible mediante MinValue, MaxValue 
Ej. Int.MinValue 
También disponibles: BigInt, BigDecimal 
Conversión mediante toX 
Ej. "234".toInt 
Boolean: valores true, false 
Char: representa caracteres
Strings 
Similares a Java 
Comparación mediante == (equals en Java) 
Sintaxis """ para cadenas multílínea 
Numerosas utilidades en StringOps
Rangos 
Range(min,max) crea rango entre min y max 
val ceroDiez = Range(1,10) 
println (ceroDiez.contains(5)) //> true 
for (i <- ceroDiez if i % 3 == 0) print(s"$i ") //> 3 6 9
Colecciones 
Traversable 
Iterable 
Jerarquía de colecciones 
Solo se muestran algunas 
Seq Set Map 
IndexedSeq LinearSeq 
Array Vector List Stream 
HashMap SortedMap
Listas 
Construcción básica mediante :: y Nil 
val x = 1 :: 2 :: 3 :: Nil 
val y = List(1,2,3) 
println(x == y) //> true
Vectores 
Operación de indexación muy rápida 
val frutas = Vector("Peras", "Limones", "Naranjas") 
println(frutas(1)) //> Limones 
println((frutas :+ "Kiwis").length) //> 4
Maps 
val notas = Map("Jose" -> 5.7, "Luis" -> 7.8) 
for ((n,v) <- notas) 
println (s"${n} tiene un ${v}") Jose tiene un 5.7 
Luis tiene un 7.8 
Arrays asociativos (Tablas Hash)
Ejercicio con agregación 
Modelar cursos con alumnos 
Una clase curso compuesta por: 
Nombre del curso 
Lista de alumnos 
Una clase alumno compuesta por 
id del alumno 
nota del alumno 
Definir métodos de curso: 
getNota(id) 
ponNota(id,nota) 
media 
1 1..n 
Curso Alumno 
https://gist.github.com/labra/79e6d273986487bc68d0
Objeto acompañante 
objecto con mismo nombre que una clase ó trait 
Es un objeto singleton (una única instancia) 
Tiene acceso a campos/métodos privados 
Uso habitual: métodos/atributos estáticos 
En Scala no hay static 
Método apply() puede usarse como factoría 
Método unapply() puede para extraer elementos
Objeto acompañante 
class Persona(nombre:String, edad:Int) { 
def getEdad = edad 
def masViejo(otro:Persona) = this.edad > otro.getEdad 
} 
object Persona { 
def apply(nombre:String): Persona = new Persona(nombre,15) 
def apply(edad:Int): Persona = new Persona("Sin nombre",edad) 
} 
val juan = Persona("Juan") 
val x = Persona(10) 
println(juan.masViejo(x)) //> true
case Classes 
Permite simplificar declaraciones 
case class Persona(nombre:String, edad:Int) 
Objetos funcionales (inmutables) 
Genera getters de los campos 
Crea objeto acompañante (fabricar instancias sin new) 
Genera equals,hashCode,toString 
val juan = Persona("Juan", 34) //> Persona(Juan,34) 
val luis = Persona("Luis", 23) //> Persona(Luis,23) 
println(juan.nombre) //> "Juan" 
println(juan == luis) //> false 
Nota 
case Classes permiten crear patrón ValueObject: http://en.wikipedia.org/wiki/Value_object
public class Persona { 
Comparación con Java 
private String nombre; 
private Integer edad; 
public String getNombre() { return nombre; } 
public Integer getEdad() { return edad; } 
@Override 
public boolean equals(Object otro) { 
if (otro == this) return true; 
if (!(otro instanceof Persona)) return false; 
Persona p = (Persona) otro; 
return p.nombre == nombre && p.edad == edad; 
} 
@Override 
public int hashCode(){ 
int result = 17; 
result = 31* result + (nombre !=null ? nombre.hashCode() : 0); 
result = 31* result + (edad !=null ? edad.hashCode() : 0); 
return result; 
} 
@Override 
public String toString() { 
return 
String.format("Persona[name=%s,birthdate=%d]", nombre, edad); 
} 
} 
Java 
Scala 
case class Persona(nombre:String, edad:Int) 
En Java, puede usarse el proyecto Lombok: http://projectlombok.org/
traits 
Reutilización de comportamiento 
trait Saludador { 
def saluda(nombre: String) { 
println("Hola " + nombre + ", soy " + this.toString) 
} 
} 
case class Persona(nombre:String, edad:Int) extends Saludador 
case class Coche(marca:String) extends Saludador 
val r21 = Coche("Renault XXI") 
val juan = Persona("Juan Manuel",34) 
r21.saluda("Pepe") //> Hola Pepe, soy Coche(Renault XXI) 
juan.saluda("Pepe") //> Hola Pepe, soy Persona(Juan Manuel,34)
Ejercicio Hashes y Arrays 
Corregir exámenes. Aciertos: +1, fallos: -0.25 
[ {"pregunta" => 1, "correcta" => "a"}, 
{"pregunta" => 2, "correcta" => "b"}] 
[ {"alumno" => 2456, 
"respuestas" => [{ "pregunta" => 1, "respuesta" => "a"}, 
{ "pregunta" => 2, "respuesta" => "b"}]}, 
{"alumno" => 4321, 
"respuestas" => [{ "pregunta" => 1, "respuesta" => "b"}, 
{ "pregunta" => 2, "respuesta" => "b"}]}] 
[ {"alumno" => 2456, "nota" => 2}, 
{"alumno" => 4321, "nota" => 0.75}]
Variables estáticas mediante object 
object puede usarse para recoger métodos y 
variables estáticas 
class Persona(nombre:String, edad:Int) 
object Persona { 
private var cuentaPersonas = 0 
def apply(nombre:String, edad:Int): Persona = { 
cuentaPersonas += 1 
new Persona(nombre,edad) 
} 
def totalPersonas(): Int = { 
cuentaPersonas 
} 
} 
val juan = Persona("Juan",23) 
val luis = Persona("Luis",31) 
println(Persona.totalPersonas) //> 2
Modularización 
package = objeto especial para agrupar código 
import: permite importar código 
Similar a Java, pero utiliza _ en lugar de * 
Permite declarer qué elementos se importan 
Incluso renombrar elementos al importarlos
Genericidad 
sealed trait Arbol[A] 
case class Hoja[A](info:A) extends Arbol[A] 
case class Rama[A](izq:Arbol[A],der:Arbol[A]) extends Arbol[A] 
def nodos[A](a: Arbol[A]): Int = 
a match { 
case Hoja(_) => 1 
case Rama(izq,der) => nodos(izq) + nodos(der) 
} 
def sumaNodos(a: Arbol[Double]): Double = 
a match { 
case Hoja(n) => n 
case Rama(izq,der) => sumaNodos(izq) + sumaNodos(der) 
} 
val a = Rama(Hoja(5.0),Rama(Hoja(5.5),Hoja(9.5))) 
println(nodos(a)) //> 3 
println(sumaNodos(a)) //> 20.0
Otras características 
Parámetros implícitos 
package objects 
varianza/covarianza de tipos 
tipos de rango superior 
...
Referencias 
Tutoriales: 
http://docs.scala-lang.org/ 
http://twitter.github.io/scala_school/ 
Guía de estilo: 
http://twitter.github.io/effectivescala/ 
Artículo acerca del lenguaje 
Unifying Functional and Object Oriented Programming, Martin Odersky 
Communications of the ACM 
http://cacm.acm.org/magazines/2014/4/173220-unifying-functional-and-object-oriented- 
programming-with-scala/fulltext
Libros

Más contenido relacionado

PPT
Scala Talk at FOSDEM 2009
PDF
Programación Orientada a Eventos Java
PDF
Python Advanced – Building on the foundation
PPTX
Basic Concepts of OOPs (Object Oriented Programming in Java)
PPTX
collection framework in java
ODP
ES6 PPT FOR 2016
PDF
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
PDF
Java 8 Lambda Expressions & Streams
Scala Talk at FOSDEM 2009
Programación Orientada a Eventos Java
Python Advanced – Building on the foundation
Basic Concepts of OOPs (Object Oriented Programming in Java)
collection framework in java
ES6 PPT FOR 2016
Scala 3 by Example - Algebraic Data Types for Domain Driven Design - Part 1
Java 8 Lambda Expressions & Streams

La actualidad más candente (20)

PDF
Swift Programming Language
PPTX
Kotlin for Android App Development Presentation
PDF
8a Curso de POO en Java - crear proyecto eclipse
PPTX
Object oriented programming in python
PPTX
Componentes de eclipse
PDF
Sequence and Traverse - Part 1
ODP
02 python Programación orientada a objetos y funcional
PDF
Why The Free Monad isn't Free
PPT
7. diseño por contrato
PDF
Functional Programming 101 with Scala and ZIO @FunctionalWorld
PPTX
Python OOPs
PDF
Monoids - Part 1 - with examples using Scalaz and Cats
PDF
18 Curso POO en java - contenedores
PDF
Python's magic methods
PPTX
Data Abstraction.pptx
PDF
non-strict functions, bottom and scala by-name parameters
PDF
Object oriented concepts
PPTX
Core Java
PDF
Programación Funcional 101 con Scala y ZIO 2.0
Swift Programming Language
Kotlin for Android App Development Presentation
8a Curso de POO en Java - crear proyecto eclipse
Object oriented programming in python
Componentes de eclipse
Sequence and Traverse - Part 1
02 python Programación orientada a objetos y funcional
Why The Free Monad isn't Free
7. diseño por contrato
Functional Programming 101 with Scala and ZIO @FunctionalWorld
Python OOPs
Monoids - Part 1 - with examples using Scalaz and Cats
18 Curso POO en java - contenedores
Python's magic methods
Data Abstraction.pptx
non-strict functions, bottom and scala by-name parameters
Object oriented concepts
Core Java
Programación Funcional 101 con Scala y ZIO 2.0
Publicidad

Destacado (16)

PDF
Programación Funcional en Scala
PPTX
4 Introducción al lenguaje Scala
PPTX
Pf con scala
PPTX
Scala en la Practica
PDF
Scala - just good for Java shops?
PDF
Curso de Scala: Trabajando con variables
PPTX
JavaFX and Scala - Like Milk and Cookies
PDF
Introducción a scala
PDF
Koreference
ODP
Scala+swing
PPTX
JavaFX 2 and Scala - Like Milk and Cookies (33rd Degrees)
PPT
Seven ways to kill your presentation
PPT
Scala
Programación Funcional en Scala
4 Introducción al lenguaje Scala
Pf con scala
Scala en la Practica
Scala - just good for Java shops?
Curso de Scala: Trabajando con variables
JavaFX and Scala - Like Milk and Cookies
Introducción a scala
Koreference
Scala+swing
JavaFX 2 and Scala - Like Milk and Cookies (33rd Degrees)
Seven ways to kill your presentation
Scala
Publicidad

Similar a Introducción a Scala (20)

KEY
Introducción a Scala
PDF
Apache spark meetup
PDF
Procesamiento de datos a gran escala con Apache Spark
PDF
Descubriendo scala
PDF
1.2. kotlin (1)
PDF
1.2. kotlin
PPTX
Fundamentos de Scala (Scala Basics) (español) Catecbol
PPTX
Codemotion 2014 Scala @real life
PPTX
Scala @ Real Life Codemotion 2014
PPTX
kotlin_25 programacion en Android p.pptx
PDF
Scala: un vistazo general
PPT
LibreríAs De Java
PDF
Java8 : Más allá de las Expresiones Lambdas
PDF
Programación Políglota en la JVM
PPTX
6-Unidad 1. Paradigma de la Programación-Orientación a Objetos
PDF
Scala en proyectos de vinculación Ancap-UR - 2013-03
PDF
Haskell wikipedia
PDF
Tipos basicos de java
PDF
Trabajo práctico sobre Clojure, Evaluación de un Lenguaje de Programación
PPT
Wilfreddy barco
Introducción a Scala
Apache spark meetup
Procesamiento de datos a gran escala con Apache Spark
Descubriendo scala
1.2. kotlin (1)
1.2. kotlin
Fundamentos de Scala (Scala Basics) (español) Catecbol
Codemotion 2014 Scala @real life
Scala @ Real Life Codemotion 2014
kotlin_25 programacion en Android p.pptx
Scala: un vistazo general
LibreríAs De Java
Java8 : Más allá de las Expresiones Lambdas
Programación Políglota en la JVM
6-Unidad 1. Paradigma de la Programación-Orientación a Objetos
Scala en proyectos de vinculación Ancap-UR - 2013-03
Haskell wikipedia
Tipos basicos de java
Trabajo práctico sobre Clojure, Evaluación de un Lenguaje de Programación
Wilfreddy barco

Más de Jose Emilio Labra Gayo (20)

PPTX
Publicaciones de investigación
PPTX
Introducción a la investigación/doctorado
PPTX
Challenges and applications of RDF shapes
PPTX
Legislative data portals and linked data quality
PPTX
Validating RDF data: Challenges and perspectives
PPTX
Legislative document content extraction based on Semantic Web technologies
PPTX
ShEx by Example
PPTX
Introduction to SPARQL
PPTX
Introducción a la Web Semántica
PPTX
RDF Data Model
PPTX
2017 Tendencias en informática
PPTX
RDF, linked data and semantic web
PPTX
Introduction to SPARQL
PPTX
19 javascript servidor
PPTX
Como publicar datos: hacia los datos abiertos enlazados
PPTX
16 Alternativas XML
PPTX
Arquitectura de la Web y Computación en el Servidor
Publicaciones de investigación
Introducción a la investigación/doctorado
Challenges and applications of RDF shapes
Legislative data portals and linked data quality
Validating RDF data: Challenges and perspectives
Legislative document content extraction based on Semantic Web technologies
ShEx by Example
Introduction to SPARQL
Introducción a la Web Semántica
RDF Data Model
2017 Tendencias en informática
RDF, linked data and semantic web
Introduction to SPARQL
19 javascript servidor
Como publicar datos: hacia los datos abiertos enlazados
16 Alternativas XML
Arquitectura de la Web y Computación en el Servidor

Último (20)

PPTX
Aplicacion_de_modelo_tpack_bienestar biopsicosocial.pptx
PDF
anatomi del cuello.pptx_20250806_153255_0000.pdf
PPTX
MICOSIS SUPERFICIALES Y PROFUNDAS, CONCEPTOS BASICOS
PDF
BIOTECNOLOGÍA y tecnicas de ingenieria.pdf
PPTX
clase # 22 EDUCACION SEXUAL.pptx para mi
PDF
Presentación sobre DENGUE.pdf (enfermedad tropical)
PPTX
EXAMEN FISICO DEL RN sem 11 - copia-1.pptx
PDF
Hernias Inguinales.pdf_20250809_192821_0000.pdf
PPT
ESTIMULACION SENSORIAL en niños con paralisis
PDF
BIODIVERSIDAD y tipos de especies de plantas y animales.pdf
PDF
Presentación de Gráficos Visuales Líneas de Tiempo Profesional Infográfic...
PPTX
Abscesos y Fístulas Anales- cirugia general
PDF
Química BIO.univ, san agustin de arequipa
PPTX
Caracteristicas fisicoquimicas del Agua.pptx
PPTX
6. Electrofisiologia de la membrana celular.pptx
PPTX
clase membranas celulares Bachi.pptx
PPTX
CUIDADOS DE ENFERMERÍA EN NIÑOS Y ADOLESCENTES
PPTX
Traumatismo craneoencefálico........pptx
PPTX
Presentación Google Earth Examen numero 1
PPTX
anestesia para cirugía laparoscópica.pptx
Aplicacion_de_modelo_tpack_bienestar biopsicosocial.pptx
anatomi del cuello.pptx_20250806_153255_0000.pdf
MICOSIS SUPERFICIALES Y PROFUNDAS, CONCEPTOS BASICOS
BIOTECNOLOGÍA y tecnicas de ingenieria.pdf
clase # 22 EDUCACION SEXUAL.pptx para mi
Presentación sobre DENGUE.pdf (enfermedad tropical)
EXAMEN FISICO DEL RN sem 11 - copia-1.pptx
Hernias Inguinales.pdf_20250809_192821_0000.pdf
ESTIMULACION SENSORIAL en niños con paralisis
BIODIVERSIDAD y tipos de especies de plantas y animales.pdf
Presentación de Gráficos Visuales Líneas de Tiempo Profesional Infográfic...
Abscesos y Fístulas Anales- cirugia general
Química BIO.univ, san agustin de arequipa
Caracteristicas fisicoquimicas del Agua.pptx
6. Electrofisiologia de la membrana celular.pptx
clase membranas celulares Bachi.pptx
CUIDADOS DE ENFERMERÍA EN NIÑOS Y ADOLESCENTES
Traumatismo craneoencefálico........pptx
Presentación Google Earth Examen numero 1
anestesia para cirugía laparoscópica.pptx

Introducción a Scala

  • 1. Introducción a Scala Jose Emilio Labra Gayo Depto. Informática Universidad de Oviedo
  • 2. Scala Creado en 2003 por Martin Odersky Lenguaje Funcional y Orientado a Objetos Tipado estático Influencias: Java, Haskell Compila a JVM Martin Odersky, Fuente: http://lampwww.epfl.ch/~odersky/ Object Oriented meets Functional. Have the best of both worlds
  • 3. Ecosistema Página: https://www.scala-lang.org Implementaciones: Scala (compila a JVM), ScalaJS (compila a Javascript) Versiones en funcionamiento: 2.9 (2011), 2.10 (2013) , 2.11 (2014) Intérprete: scala Compilador: scalac Construcción: sbt (http://www.scala-sbt.org) Búsqueda: http://scalex.org/ Documentación: http://docs.scala-lang.org/
  • 4. Hola Mundo en Scala object Saluda { def main(args: Array[String]) = println("Hola desde Scala!") } holaMundo.scala Varias formas de ejecutarlo: Intérprete: scala Compilador: scalac > scala holaMundo.scala Hola desde Scala! > scalac holaMundo.scala > scala holaMundo Hola desde Scala!
  • 5. Conceptos básicos Lenguaje funcional y Orientado a Objetos Diferencia entre valores y variables val x = 5 //> x : Int = 5 println(x) //> 5 x = x + 1 //> error: reassignment to val var x = 6 //> x : Int = 6 x = x + 1 println(x) //> 7
  • 6. Chequeo e inferencia de Tipos Chequeo estático de tipos Tiempo de compilación Objetivo: Si compila, entonces no hay error de tipos Sistema de inferencia de tipos Muchas declaraciones de tipos = opcionales Si se declara, se comprueba que está bien val x: Int = 2 + 3 //> x : Int = 5 val y = 2 + 3 //> y : Int = 5 val z: Boolean = 2 + 3 //> error: type mismatch; found : Int(5) required: Boolean
  • 7. Sintaxis básica Nombres de variabes similar a Java Bloque de sentencias entre { } y separados por ; Valor del bloque = valor de último elemento Un bloque es una expresión
  • 8. Sintaxis básica Las sentencias tienen un ; al final Pero en muchas ocasiones puede omitirse El Sistema lo infiere { val x = 3 x + x } { val x = 3 ; x + x } ≡ NOTA: A veces se producen mensajes de error extraños (unexpected ;) Cuidado con expresiones del tipo: val prueba = uno + dos val prueba = uno + dos ; val prueba = uno + dos val prueba = uno ; + dos ;
  • 9. Ámbito de variables Variables locales Definiciones en un bloque sólo visibles dentro de él Definiciones en un bloque tapan definiciones externas val x = 3 def f(x: Int) = x + 1 val resultado = { val x = f(3) x * x } + x println(resultado) //> ??? ¿Qué imprime?
  • 10. Sintaxis básica Todo son expresiones val mensaje = if (edad > 18) "Puede votar" else "Es menor" Numerosas simplificaciones ( ) opcionales con métodos de 0 ó 1 argumento 2 + 3 == 2.+(3) . opcional (operador posfijo) juan.saluda() juan.saluda juan saluda juan.saluda("Pepe") juan saluda("pepe") juan saluda "pepe"
  • 11. Sintaxis básica Declaraciones de tipo después de variable Java Scala Integer x = 0; val x: Int = 0 Java Scala Integer suma(Integer a, Integer b) { return a + b; } def suma(x:Int, y:Int) = x + y No es necesario return
  • 12. ScalaTest Crear los siguientes métodos par(n) compruebe si un número es par fact(n) devuelve el factorial de un nº Pasos a seguir: Descargar/clonar: https://github.com/cursosLabra/EjerciciosScala Contiene una plantilla con la estructura de directories Pruebas mediante ScalaTest Utilizar SBT (Simple Build Tool) > sbt test ScalaTest de Factorial https://gist.github.com/labra/2c16ad44ac484d0271d6
  • 13. Objetos y clases Herencia universal de Object No hay tipos primitivos Int, Boolean, Float, Double, etc = clases Object AnyVal AnyRef Int Long Double ... String List ... Nothing/Null
  • 14. Declaración de Objetos object permite definir objetos singleton object juan { var edad = 34 val nombre = "Juan Manuel" def crece() { this.edad += 1 } def getEdad():Int = this.edad def masViejo(otro: { def getEdad(): Int}) = this.edad > otro.getEdad } NOTA Scala es un lenguaje basado en clases En realidad, object crea un objeto singleton de una clase Juan
  • 15. Clases: Estilo imperativo Mediante class class Persona(nombre: String, var edad: Int) { def crece(): Unit { this.edad += 1 } def masViejo(otro: Persona): Boolean = { this.edad > otro.getEdad } def getEdad() = edad } val juan = new Persona("Juan Manuel", 34) juan.crece println (juan.getEdad) //> 35 val pepe = new Persona("Jose Luis", 22) println(pepe.masViejo(juan)) //> false Objetos mutables edad es una variable que se actualiza
  • 16. Clases: Estilo funcional Objetos inmutables Operaciones de escritura devuelven nuevos objetos class Persona(nombre: String, edad: Int) { def crece(): Persona = { new Persona(nombre, this.edad + 1) } def masViejo(otro: Persona): Boolean = { this.edad > otro.getEdad } def getEdad() = edad } val juan = new Persona("Juan Manuel", 34) println (juan.getEdad) //> 34 val juan1 = juan.crece println (juan1.getEdad) //> 35 println (juan.getEdad) //> 34
  • 17. Herencia Mediante extends class Usuario(nombre: String, edad:Int, email: String) extends Persona(nombre,edad) { def login(email: String): Boolean = { this.email == email } } def sumaEdades(personas:List[Persona]): Int = { personas.map(_.getEdad).sum } val juan = new Persona("Juan", 34) val luis = new Usuario("Luis", 20, "luis@mail.com") println(sumaEdades(List(juan,luis))) //> 54
  • 18. Ejercicio: Figuras Crear una clase Figura con 2 atributos (x,y) Método que permita mover la figura Crear una clase Rect para representar Rectángulos Atributos a (ancho) y b (altura) Crear una clase Circulo para representar Círculos Atributo r (radio) Crear método area para calcular el area Crear método areas que calcula el area de una lista de figuras https://gist.github.com/labra/170a570f49922fd5281c
  • 19. Estructuras de control if match while for, foreach try
  • 20. Estructuras de control if es similar a otros lenguajes Devuelve un valor val mensaje = if (edad >= 18) "Puede votar" else "Es menor"
  • 21. While, do...while Similares a Java def mcd(x:Int,y:Int):Int = { var a = x var b = y while(a != 0) { val temp = a a = b % a b = temp } b } NOTA: Los bucles While suelen ser imperativos. Pueden re-escribirse mediante recursividad def mcd(x:Int,y:Int):Int = { if (x == 0) y else mcd(y % x,x) }
  • 22. Bucles While e iteradores Estilo imperativo def mediaEdad(personas: List[Persona]): Double = { var suma = 0 val it = personas.iterator while (it.hasNext) { val persona = it.next() suma += persona.edad } suma / personas.length } NOTA: Puede re-escribirse con estilo funcional: def mediaEdad(personas: List[Persona]): Double = { personas.map(_.edad).sum / personas.length }
  • 23. Encaje de patrones Expresión match dia match { case "Sabado" => println("Fiesta") case "Domingo" => println("Dormir") case _ => println("Programar en Scala") } Expresión match devuelve un valor val mensaje = dia match { case "Sabado" => "Fiesta" case "Domingo" => "Dormir" case _ => "Programar en Scala" }
  • 24. Bucles for Contienen: Generadores (suelen ser colecciones) Filtros (condiciones) yield: Valores que se devuelven def pares(m:Int,n:Int): List[Int] = for (i <- List.range(m,n) if i % 2 == 0) yield i println(pares(0,10)) //> List(0,2,4,6,8,10) Si no hay yield se devuelve Unit Similar a bucles convencionales de otros lenguajes for (i <- 1 to 4) print("x" + i) //> x1 x2 x3 x4
  • 25. Excepciones try...throw...catch...similar a Java def divide(m:Int, n:Int) : Int = { if (n == 0) throw new RuntimeException("division por 0") else m / n } try { println("5/4 = " + divide(5,4)) println("5/0 = " + divide(5,0)) } catch { case e: Exception => println("Error: " + e.getMessage) } finally { println("Fin") } 5/4 = 1 Error: division por 0 Fin
  • 26. Clase Option Option permite definir funciones parciales Puede utilizarse para evitar uso de excepciones def divide(m:Int, n:Int) : Option[Int] = { if (n == 0) None else Some(m / n) } println("5/4 = " + divide(5,4)) //> Some(1) println("5/0 = " + divide(5,0)) //> None NOTA: La clase Try puede también utilizarse.
  • 27. Ejercicio Calcular los factores primos de un número Ejemplo: factores 1 = [1] factores 2 = [1,2] factores 3 = [1,3] factores 4 = [1,2,2] factores 5 = [1,5] factores 6 = [1,2,3] ... https://gist.github.com/labra/270a37314524db303f7c
  • 28. Funciones en Scala Varias formas de declarar funciones def suma(x:Int,y:Int) = x + y def suma(x:Int,y:Int): Int = x + y def suma(x:Int,y:Int): Int = { return x + y } Procedimiento = función que devuelve valor de tipo Unit def suma3(x:Int,y:Int) { println(x + y) } def suma4(x:Int,y:Int):Unit = { println(x + y) }
  • 29. Programación funcional Funciones como valores val suma = (x:Int,y:Int) => x + y Funciones de orden superior def suma3(x:Int) = x + 3 def aplica2(f: Int => Int, x: Int) = f(f(x)) println(aplica2(suma3,2)) //> 8 println(aplica2((x:Int) => x * x,2)) //> 16
  • 30. Tipos predefinidos Numéricos: Int, BigInt, Float, Double Boolean String Rangos Tuplas Regex Null Any, AnyVal, AnyRef
  • 31. Números, booleanos y caracteres Similares a Java pero sin tipos primitivos Byte, Short, Int, Long, Float, Double Rango disponible mediante MinValue, MaxValue Ej. Int.MinValue También disponibles: BigInt, BigDecimal Conversión mediante toX Ej. "234".toInt Boolean: valores true, false Char: representa caracteres
  • 32. Strings Similares a Java Comparación mediante == (equals en Java) Sintaxis """ para cadenas multílínea Numerosas utilidades en StringOps
  • 33. Rangos Range(min,max) crea rango entre min y max val ceroDiez = Range(1,10) println (ceroDiez.contains(5)) //> true for (i <- ceroDiez if i % 3 == 0) print(s"$i ") //> 3 6 9
  • 34. Colecciones Traversable Iterable Jerarquía de colecciones Solo se muestran algunas Seq Set Map IndexedSeq LinearSeq Array Vector List Stream HashMap SortedMap
  • 35. Listas Construcción básica mediante :: y Nil val x = 1 :: 2 :: 3 :: Nil val y = List(1,2,3) println(x == y) //> true
  • 36. Vectores Operación de indexación muy rápida val frutas = Vector("Peras", "Limones", "Naranjas") println(frutas(1)) //> Limones println((frutas :+ "Kiwis").length) //> 4
  • 37. Maps val notas = Map("Jose" -> 5.7, "Luis" -> 7.8) for ((n,v) <- notas) println (s"${n} tiene un ${v}") Jose tiene un 5.7 Luis tiene un 7.8 Arrays asociativos (Tablas Hash)
  • 38. Ejercicio con agregación Modelar cursos con alumnos Una clase curso compuesta por: Nombre del curso Lista de alumnos Una clase alumno compuesta por id del alumno nota del alumno Definir métodos de curso: getNota(id) ponNota(id,nota) media 1 1..n Curso Alumno https://gist.github.com/labra/79e6d273986487bc68d0
  • 39. Objeto acompañante objecto con mismo nombre que una clase ó trait Es un objeto singleton (una única instancia) Tiene acceso a campos/métodos privados Uso habitual: métodos/atributos estáticos En Scala no hay static Método apply() puede usarse como factoría Método unapply() puede para extraer elementos
  • 40. Objeto acompañante class Persona(nombre:String, edad:Int) { def getEdad = edad def masViejo(otro:Persona) = this.edad > otro.getEdad } object Persona { def apply(nombre:String): Persona = new Persona(nombre,15) def apply(edad:Int): Persona = new Persona("Sin nombre",edad) } val juan = Persona("Juan") val x = Persona(10) println(juan.masViejo(x)) //> true
  • 41. case Classes Permite simplificar declaraciones case class Persona(nombre:String, edad:Int) Objetos funcionales (inmutables) Genera getters de los campos Crea objeto acompañante (fabricar instancias sin new) Genera equals,hashCode,toString val juan = Persona("Juan", 34) //> Persona(Juan,34) val luis = Persona("Luis", 23) //> Persona(Luis,23) println(juan.nombre) //> "Juan" println(juan == luis) //> false Nota case Classes permiten crear patrón ValueObject: http://en.wikipedia.org/wiki/Value_object
  • 42. public class Persona { Comparación con Java private String nombre; private Integer edad; public String getNombre() { return nombre; } public Integer getEdad() { return edad; } @Override public boolean equals(Object otro) { if (otro == this) return true; if (!(otro instanceof Persona)) return false; Persona p = (Persona) otro; return p.nombre == nombre && p.edad == edad; } @Override public int hashCode(){ int result = 17; result = 31* result + (nombre !=null ? nombre.hashCode() : 0); result = 31* result + (edad !=null ? edad.hashCode() : 0); return result; } @Override public String toString() { return String.format("Persona[name=%s,birthdate=%d]", nombre, edad); } } Java Scala case class Persona(nombre:String, edad:Int) En Java, puede usarse el proyecto Lombok: http://projectlombok.org/
  • 43. traits Reutilización de comportamiento trait Saludador { def saluda(nombre: String) { println("Hola " + nombre + ", soy " + this.toString) } } case class Persona(nombre:String, edad:Int) extends Saludador case class Coche(marca:String) extends Saludador val r21 = Coche("Renault XXI") val juan = Persona("Juan Manuel",34) r21.saluda("Pepe") //> Hola Pepe, soy Coche(Renault XXI) juan.saluda("Pepe") //> Hola Pepe, soy Persona(Juan Manuel,34)
  • 44. Ejercicio Hashes y Arrays Corregir exámenes. Aciertos: +1, fallos: -0.25 [ {"pregunta" => 1, "correcta" => "a"}, {"pregunta" => 2, "correcta" => "b"}] [ {"alumno" => 2456, "respuestas" => [{ "pregunta" => 1, "respuesta" => "a"}, { "pregunta" => 2, "respuesta" => "b"}]}, {"alumno" => 4321, "respuestas" => [{ "pregunta" => 1, "respuesta" => "b"}, { "pregunta" => 2, "respuesta" => "b"}]}] [ {"alumno" => 2456, "nota" => 2}, {"alumno" => 4321, "nota" => 0.75}]
  • 45. Variables estáticas mediante object object puede usarse para recoger métodos y variables estáticas class Persona(nombre:String, edad:Int) object Persona { private var cuentaPersonas = 0 def apply(nombre:String, edad:Int): Persona = { cuentaPersonas += 1 new Persona(nombre,edad) } def totalPersonas(): Int = { cuentaPersonas } } val juan = Persona("Juan",23) val luis = Persona("Luis",31) println(Persona.totalPersonas) //> 2
  • 46. Modularización package = objeto especial para agrupar código import: permite importar código Similar a Java, pero utiliza _ en lugar de * Permite declarer qué elementos se importan Incluso renombrar elementos al importarlos
  • 47. Genericidad sealed trait Arbol[A] case class Hoja[A](info:A) extends Arbol[A] case class Rama[A](izq:Arbol[A],der:Arbol[A]) extends Arbol[A] def nodos[A](a: Arbol[A]): Int = a match { case Hoja(_) => 1 case Rama(izq,der) => nodos(izq) + nodos(der) } def sumaNodos(a: Arbol[Double]): Double = a match { case Hoja(n) => n case Rama(izq,der) => sumaNodos(izq) + sumaNodos(der) } val a = Rama(Hoja(5.0),Rama(Hoja(5.5),Hoja(9.5))) println(nodos(a)) //> 3 println(sumaNodos(a)) //> 20.0
  • 48. Otras características Parámetros implícitos package objects varianza/covarianza de tipos tipos de rango superior ...
  • 49. Referencias Tutoriales: http://docs.scala-lang.org/ http://twitter.github.io/scala_school/ Guía de estilo: http://twitter.github.io/effectivescala/ Artículo acerca del lenguaje Unifying Functional and Object Oriented Programming, Martin Odersky Communications of the ACM http://cacm.acm.org/magazines/2014/4/173220-unifying-functional-and-object-oriented- programming-with-scala/fulltext