Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Por que dizemos que Scala é uma linguagem funcional?

Por que dizemos que Scala é uma linguagem funcional?

Presented at: VII Scaladores, June/2012.

Pedro Matiello

June 13, 2012
Tweet

More Decks by Pedro Matiello

Other Decks in Programming

Transcript

  1. POR QUE DIZEMOS QUE
    SCALA É UMA LINGUAGEM
    FUNCIONAL?

    View Slide

  2. Pedro Matiello
    [email protected]
    @pmatiello
    POR QUE DIZEMOS QUE
    SCALA É UMA LINGUAGEM
    FUNCIONAL?

    View Slide

  3. SCALA

    View Slide

  4. •Tipagem estática
    •Programação orientada a objetos
    •Programação funcional

    View Slide

  5. PROGRAMAÇÃO FUNCIONAL

    View Slide

  6. •Hughes, John.: Why Functional
    Programming Matters. The Computer
    Journal (1984)

    View Slide

  7. •A operação fundamental é a aplicação de funções

    View Slide

  8. •Um programa é uma função
    •Normalmente composta de outras funções
    •A entrada são os argumentos
    •A saída é o valor devolvido

    View Slide













  9. f(x) = x²

    View Slide

  10. •Transparência referencial (referential transparency)
    •A aplicação de uma função não produz efeitos
    colaterais

    View Slide

  11. •Funções de ordem superior (higher-order functions)
    •Avaliação atrasada (lazy evaluation)

    View Slide

  12. FUNÇÕES DE ORDEM
    SUPERIOR

    View Slide

  13. •Uma função de ordem superior satisfaz ao menos
    uma das propriedades abaixo:
    •Aceita ao menos uma função como argumento
    •Devolve uma função

    View Slide

  14. scala> def square(i:Int) = i*i
    square: (i: Int)Int
    scala> val list = (1 to 10).toList
    list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    View Slide

  15. scala> def square(i:Int) = i*i
    square: (i: Int)Int
    scala> val list = (1 to 10).toList
    list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    scala> list.map(square)
    res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81,
    100)

    View Slide

  16. scala> def square(i:Int) = i*i
    square: (i: Int)Int
    scala> val list = (1 to 10).toList
    list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    scala> list.map(square)
    res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81,
    100)

    View Slide

  17. AVALIAÇÃO ATRASADA

    View Slide

  18. •Estratégia de avaliação que satisfaz ambas as
    propriedades abaixo:
    •A avaliação da expressão é atrasada até que o
    valor seja necessário (non-strict evaluation)
    •Avaliações repetidas são evitadas (sharing)

    View Slide

  19. def loop(condition: => Boolean)(expression: => Unit) {
    if (condition) {
    expression
    loop(condition)(expression)
    }
    }
    CALL BY NAME

    View Slide

  20. def loop(condition: => Boolean)(expression: => Unit) {
    if (condition) {
    expression
    loop(condition)(expression)
    }
    }
    CALL BY NAME

    View Slide

  21. def loop(condition: => Boolean)(expression: => Unit) {
    if (condition) {
    expression
    loop(condition)(expression)
    }
    }
    var i = 0;
    loop(i < 5) { println(i); i=i+1 }
    CALL BY NAME

    View Slide

  22. def loop(condition: => Boolean)(expression: => Unit) {
    if (condition) {
    expression
    loop(condition)(expression)
    }
    }
    var i = 0;
    loop(i < 5) { println(i); i=i+1 }
    0
    1
    2
    3
    4
    CALL BY NAME

    View Slide

  23. def loop(condition: => Boolean)(expression: => Unit) {
    if (condition) {
    expression
    loop(condition)(expression)
    }
    }
    var i = 0;
    loop(i < 5) { println(i); i=i+1 }
    0
    1
    2
    3
    4
    CALL BY NAME
    (apenas non-strict evaluation)

    View Slide

  24. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    LAZY VALS

    View Slide

  25. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    LAZY VALS

    View Slide

  26. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    scala> if (true) x else y
    LAZY VALS

    View Slide

  27. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    scala> if (true) x else y
    avaliou x
    res0: java.lang.String = XXX
    LAZY VALS

    View Slide

  28. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    scala> if (true) x else y
    avaliou x
    res0: java.lang.String = XXX
    scala> if (true) x else y
    LAZY VALS

    View Slide

  29. scala> lazy val x = { println("avaliou x"); "XXX" }
    x: java.lang.String =
    scala> lazy val y = { println("avaliou y"); "YYY" }
    y: java.lang.String =
    scala> if (true) x else y
    avaliou x
    res0: java.lang.String = XXX
    scala> if (true) x else y
    res1: java.lang.String = XXX
    LAZY VALS

    View Slide

  30. scala> lazy val eagerNaturals:List[Int] =
    0 :: eagerNaturals.map(_+1)
    eagerNaturals: List[Int] =
    STREAMS

    View Slide

  31. scala> lazy val eagerNaturals:List[Int] =
    0 :: eagerNaturals.map(_+1)
    eagerNaturals: List[Int] =
    scala> eagerNaturals.take(20)
    java.lang.StackOverflowError
    ! at .eagerNaturals(:7)
    ! at .eagerNaturals(:7)
    ! ...
    STREAMS

    View Slide

  32. scala> lazy val lazyNaturals:Stream[Int] =
    0 #:: lazyNaturals.map(_+1)
    lazyNaturals: Stream[Int] =
    STREAMS

    View Slide

  33. scala> lazy val lazyNaturals:Stream[Int] =
    0 #:: lazyNaturals.map(_+1)
    lazyNaturals: Stream[Int] =
    scala> lazyNaturals.take(20)
    res0: scala.collection.immutable.Stream[Int] =
    Stream(0, ?)
    STREAMS

    View Slide

  34. scala> lazy val lazyNaturals:Stream[Int] =
    0 #:: lazyNaturals.map(_+1)
    lazyNaturals: Stream[Int] =
    scala> lazyNaturals.take(20).toList
    res1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    STREAMS

    View Slide

  35. POR QUE DIZEMOS QUE SCALA É
    UMA LINGUAGEM FUNCIONAL?
    Pedro Matiello
    [email protected]
    @pmatiello

    View Slide