Programación funcional en Scala (1)

Table of Contents

Referencias

El lenguaje de programación Scala

  • Se desarrolla en 2001 en la universidad EPFL (Suiza) por un equipo dirigido por Martin Odersky
  • El objetivo principal del lenguaje es integrar el paradigma funcional y el paradigma orientado a objetos
  • Énfasis en la facilidad del desarrollo de componentes reusables
  • Está basado en Java: los programas en Scala se compilan a bytecodes de Java y se ejecutan en la máquina virtual Java
  • Sus características funcionales lo hacen muy apropiado para desarrollar programas muy eficientes en arquitecturas paralelas formadas por granjas de múltiples ordenadores (Twitter usa Scala)
  • Sitio web: www.scala-lang.org

Unificación de PF y POO

  • Programación funcional: hace fácil desarrollar cosas interesantes desde partes sencillas, usando:
    • funciones de orden superior
    • tipos algebraicos y pattern matching
    • polimorfismo paramétrico
  • Programación orientada a objetos: hace fácil adaptar y extender sistemas complejos, usando:
    • especialización (subclases) y herencia
    • configuraciones dinámicas
    • clases como abstracciones parciales

Diseño de Scala

  • Lenguaje moderno que satisface las necesidades más importantes de los desarrolladores actuales
  • Completamente compatible con Java
  • Modelo de objetos uniforme
  • Pattern matching
  • Funciones de orden superior
  • Nuevas formas para abstraer y componer programas

Características de Scala

  • Estrictamente tipeado, con características de scripting porque en muchas ocasiones el compilador realiza una inferencia de tipos
  • Interoperabilidad: encaja perfectamente en un entorno Java.
  • Conciso
// Java
class MyClass{
    private int index;
    private String name;

    public MyClass(int index, String name){
        this.index = index;
        this.name = name;
    }
}
// Scala
class MyClass(index: Int, name: String)

Scala utiliza la PF

  • Un par de ejemplos con funciones de orden superior:
    //Java
    boolean nameHasUpperCase = false;
    for (int i=0; i<name.length(); ++i){
        if(Character.isUpperCase(name.charAt(i))){
            nameHasUpperCase = true;
            break;
        }
    }
    
    //Scala
    val nameHasUpperCase = name.exists(_.isUpperCase)
    
    scala> val matrix = Array(Array(1, 0, 0),
              Array(0, 1, 0),
              Array(0, 0, 1))
    matrix: Array[Array[Int]] = Array ([I@164da25,...
    scala> matrix.exists(row => row.forall(0 ==))
    res13: Boolean = false
    

Scala es orientado a objetos

  • A diferencia de Java o C++ en Scala no existen tipos primitivos que no son objetos
  • Todas las expresiones se compilan a llamadas a métodos de objetos
    scala> (1).hashCode
    res8: Int = 1
    scala> (1).+(2)
    res10: Int = 3
    
  • Veremos más detalles de POO en Scala en los últimos tema de la asignatura

Scala como intérprete y compilador

  • Scala permite ejecutar sus programas en modo scripting o en modo compilado
  • Hasta ahora hemos usado el intérprete de Scala
  • Cada línea de código es compilada y se genera bytecode que es ejecutado por la MV Java

Compilación a bytecodes

  • Se puede llamar a un script de Scala con el comando scala
    println("Hola, "+ args(0) +"!")
    
    args.foreach(arg => println(arg))
    
  • También es posible utilizar el compilador de Scala explícitamente, con el comando scalac
    helloworld.scala:
    // Definimos un singleton: una clase con un único objeto
    object HelloWorld {
       def main(args: Array[String]) {
         println("Hello, world!")
       }
     }
    $ scalac helloworld.scala
    $ scala HelloWorld
    




Lenguajes y Paradigmas de Programación
Curso 2010-2011
Departamento de Ciencia de la Computación e Inteligencia Artificial
Universidad de Alicante

Sitio web realizado con org-mode y el estilo CSS del proyecto Worg

Validate XHTML 1.0