Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Scala Bruno Barros e Rebeka Gomes blbs,rgo2@cin.ufpe.br
2
Roteiro Introdução Paradigmas Especificação Concorrência Scala x Java Exercícios
3
Introdução Autor: Martin Odersky Co-designer do generics de Java e implementou o javac Criada em 2001 na École Polytechnique Fédérale de Lausanne (EPFL) Primeira versão disponibilizada em 2003 A versão mais recente é de Maio de 2008
4
Introdução Definição: Linguagem híbrida (funcional/orientada a objeto) e estaticamente tipada Pode ser interpretada ou compilada em byte- code. Existe versão para a plataforma Java e a.NET
5
Paradigmas Orientação a objeto Tudo é objeto Comportamento dos objetos são descritos em classes e Traits Herança e overriding Genericity
6
Paradigmas Funcional Toda função é um valor Permite usar pattern matching Suporta funções de alta ordem e anônimas Suporta funções aninhadas e currying
7
Paradigmas def sort(xs: Array[int]) { def swap(i: int, j: int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } def sort1(l: int, r: int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) { i = i + 1 } while (xs(j) > pivot) { j = j - 1 } if (i <= j) { swap(i, j) i = i + 1 j = j - 1 } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length 1) } def sort(xs: Array[int]): Array[int] = if (xs.length <= 1) xs else { val pivot = xs(xs.length / 2) Array.concat( sort(xs filter (pivot >)), xs filter (pivot ==), sort(xs filter (pivot <))) }
8
Especificação Funções Toda função é um objeto É possível: passar funções como parâmetros guardar funções em variáveis retornar funções
9
Especificação object Timer { def oncePerSecond(callback: () => unit) { while (true) { callback(); Thread sleep 1000 } } def timeFlies() { println("time flies like an arrow...") } def main(args: Array[String]) { oncePerSecond(timeFlies) }
10
Especificação Funções anônimas object TimerAnonymous { def oncePerSecond(callback: () => unit) { while (true) { callback(); Thread sleep 1000 } } def main(args: Array[String]) { oncePerSecond(() => println("time flies like an arrow...") ) }
11
Especificação Classes Declaração: class Complex(real: double, imaginary: double) { def re() = real def im() = imaginary } Criando uma instância new Complex(1.5, 2.3)
12
Especificação Overriding class Complex(real: double, imaginary: double) { def re = real def im = imaginary override def toString() = "" + re + (if (im < 0) "" else "+") + im + "i" }
13
Especificação Herança class Real (r: double) extends Complex (r,0){ override def im = 0; }
14
Especificação Classes abstratas abstract class IntSet { def insert(x: int): IntSet def contains(x: int): boolean }
15
Especificação Trait trait Printer{ def print(): String } trait Set{ def insert(a: Any): Set def contains(a: Any): boolean }
16
Especificação class EmptyPrintVector() extends Printer with Set { def print() = “Empty” def insert(a: Any) = this def contains(a: Any) = false }
17
Especificação trait Printer{ def print(): String } trait EmptySet{ def insert(a: Any) = this def contains(a: Any) = false }
18
Especificação class EmptyPrintVector() extends Printer with EmptySet { def print() = “Empty” }
19
Especificação Mixins trait Ord { def < (that: Any): boolean def <=(that: Any): boolean = (this < that) || (this == that) def > (that: Any): boolean = !(this <= that) def >=(that: Any): boolean = !(this < that) }
20
Especificação class Date(y: int, m: int, d: int) extends Ord { def year = y def month = m def day = d override def equals(that: Any): boolean = that.isInstanceOf[Date] && { val o = that.asInstanceOf[Date] o.day == day && o.month == month && o.year == year } def <(that: Any): boolean = { if (!that.isInstanceOf[Date]) error("cannot compare " + that + " and a Date") val o = that.asInstanceOf[Date] (year < o.year) || (year == o.year && (month < o.month || (month == o.month && day < o.day))) }
21
Especificação Case Classes e pattern matching abstract class Tree case class Sum(l: Tree, r: Tree) extends Tree case class Var(n: String) extends Tree case class Const(v: int) extends Tree
22
Especificação type Environment = String => int //val env: Environment = { case "x" => 5 case "y" => 7 } def eval(t: Tree, env: Environment): int = t match { case Sum(l, r) => eval(l, env) + eval(r, env) case Var(n) => env(n) case Const(v) => v }
23
Especificação Genericity class Reference[T] { private var contents: T = _ def set(value: T) { contents = value } def get: T = contents }
24
Especificação object IntegerReference { def main(args: Array[String]) { val cell = new Reference[Int] cell.set(13) println("Reference contains the half of " + (cell.get * 2)) }
25
Concorrência Monitores def synchronized[a] (e: => a): a def wait() def wait(msec: long) def notify() def notifyAll()
26
Concorrência class BoundedBuffer[a] (N: int) { var in = 0, out = 0, n = 0 val elems = new Array[a](N) def put(x: a) = synchronized { while (n >= N) wait() elems(in) = x ; in = (in + 1) % N ; n = n + 1 if (n == 1) notifyAll() } def get: a = synchronized { while (n == 0) wait() val x = elems(out) ; out = (out + 1) % N ; n = n 1 if (n == N 1) notifyAll() x }
27
Concorrência Semaphores package scala.concurrent class Lock { var available = true def acquire = synchronized { while (!available) wait() available = false } def release = synchronized { available = true notify() }
28
Concorrência SyncVars Futures Parallel Computations Readers/Writers Asynchronous Channels Synchronous Channels Workers Mailboxes Actors
29
Scala x Java object HelloWorld { def main(args: Array[String]) { println("Hello, world!") } import scala.Predef$; import scala.ScalaObject; public final class HelloWorld$ implements ScalaObject { public static final HelloWorld$ MODULE$ = this; static { new HelloWorld$(); } public static void main(String args[]) { Predef$.MODULE$.println("Hello, world!"); } public int $tag() { return scala.ScalaObject.class.$tag(this); }
30
Exercícios 1 - Defina as seguintes funções square e sumSquare em Scala; 2 - Como ficaria o seguinte código Haskell em Scala? fibonnaci :: Num a => a -> a fibonnaci 0 = 1 fibonnaci 1 = 1 fibonnaci n = fibonnaci (n - 1) + fibonnaci (n - 2) 3 - Explique brevemente alguns tipos de abstrações utilizadas para obter concorrência em Scala
31
Referências Scala documentation http://www.scala-lang.org/docu/index.html
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.