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

LambdaMA 2

mschonfinkel
December 15, 2017

LambdaMA 2

mschonfinkel

December 15, 2017
Tweet

More Decks by mschonfinkel

Other Decks in Research

Transcript

  1. Histories O que é ser funcional? Haskell No início era

    o λ. [Church 1:1] Marcos 'Tarski' mschonnkel <Github> 15 de Dezembro de 2017 Marcos 'Tarski' Haskell
  2. Histories O que é ser funcional? Haskell Overview 1 Histories

    Frege Paradoxo de Russell Soluções pro paradoxo Lógica e o cálculo-λ 2 O que é ser funcional? 3 Haskell Tipos Tipos de funções Listas Ranges Listas innitas List Comprehension Marcos 'Tarski' Haskell
  3. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Frege Gottlob Frege Matemático alemão. Começou como geômetra, mas depois se interessou por Lógica e fundamentos da aritmética. Marcos 'Tarski' Haskell
  4. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Frege Gottlob Frege Primeiro tratamento rigoroso para funções. Primeira notação para expressar expressões lógicas complicadas. Marcos 'Tarski' Haskell
  5. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Compreensão de Conjutos I Compreensão de Conjutos É possível construir conjutos contendo entidades x, que obedecem uma propriedade P(x).
  6. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Compreensão de Conjutos II Example Conjuto dos números primos: {x | x é primo} ou seja {x | P (x) é verdadeiro} onde P (x) é verdadeiro se x é um número primo.
  7. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Bug??? Marcos 'Tarski' Haskell
  8. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Paradoxo de Russell Bertrand Russell Marcos 'Tarski' Haskell
  9. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Paradoxo de Russell Bertrand Russell O conjuto de todos os conjuntos é um conjunto, então ele é membro do conjunto de todos os conjutos. Marcos 'Tarski' Haskell
  10. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Paradoxo de Russell Bertrand Russell O conjuto de todos os conjuntos é um conjunto, então ele é membro do conjunto de todos os conjutos. (OK!) Marcos 'Tarski' Haskell
  11. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Paradoxo de Russell Bertrand Russell O conjuto de todos os conjuntos é um conjunto, então ele é membro do conjunto de todos os conjutos. (OK!) O conjunto de todos os gatos não é um gato, então ele não é membro do conjunto de gatos. Marcos 'Tarski' Haskell
  12. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Onde realmente está o Bug??? Marcos 'Tarski' Haskell
  13. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ A fonte do bug Conjunto de todos os conjuntos que não se contém C = {x|x ∈ x} Marcos 'Tarski' Haskell
  14. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ A fonte do bug Conjunto de todos os conjuntos que não se contém C = {x|x ∈ x} O conjuto C se contém? Quickcheck Se C ∈ C, então C ∈ C, logo C ∈ C, portanto ... Se C ∈ C, então C ∈ C, logo C ∈ C, portanto ... Marcos 'Tarski' Haskell
  15. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Pull request do Zermelo Ernst Zermelo Axioma da separação ∀z∀w1 . . . wn∃y∀x(x ∈ y ⇐⇒ (x ∈ z∧φ)) que é um dos axiomas de Axiomas de Zermelo-Fraenkel. Marcos 'Tarski' Haskell
  16. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell A solução do Russell foi adotar uma hierarquia de objetos: números (tipo 0) Marcos 'Tarski' Haskell
  17. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell A solução do Russell foi adotar uma hierarquia de objetos: números (tipo 0) conjutos de números (tipo 1) Marcos 'Tarski' Haskell
  18. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell A solução do Russell foi adotar uma hierarquia de objetos: números (tipo 0) conjutos de números (tipo 1) conjuntos de conjuntos de números (tipo 2) Marcos 'Tarski' Haskell
  19. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell A solução do Russell foi adotar uma hierarquia de objetos: números (tipo 0) conjutos de números (tipo 1) conjuntos de conjuntos de números (tipo 2) . . . Marcos 'Tarski' Haskell
  20. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell Example O conjuto {1, 2, 3} possui tipo 1, pois contém objetos do tipo 0. Conjutos do tipo 1 podem contém apenas objetos de tipos inferiores. Marcos 'Tarski' Haskell
  21. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Solução do Russell Example O conjuto {1, 2, 3} possui tipo 1, pois contém objetos do tipo 0. Conjutos do tipo 1 podem contém apenas objetos de tipos inferiores. A teoria dos tipos serve de alternativa pra teoria dos conjutos e ela acabou dando origem a um paradigma de programação desenvolvido a partir dos princípios dela. Marcos 'Tarski' Haskell
  22. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Cálculo-λ Alonzo Church Haskell B. Curry Marcos 'Tarski' Haskell
  23. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ Notação λ Example λx.x + 1 É uma função que toma um argumento "x"e retorna x + 1. Marcos 'Tarski' Haskell
  24. Histories O que é ser funcional? Haskell Frege Paradoxo de

    Russell Soluções pro paradoxo Lógica e o cálculo-λ EXTRA Algumas leituras legais: Vellum Finding and Understanding Bugs in C Compilers Marcos 'Tarski' Haskell
  25. Histories O que é ser funcional? Haskell First Class Citizens

    Funções são consideradas cidadãs de primeira classe se puderem ser passadas como parâmetros para outras funções, ou retornadas como argumentos. Marcos 'Tarski' Haskell
  26. Histories O que é ser funcional? Haskell Side Eects Efeitos

    colaterais Consideramos que uma função tem um efeito colateral se ela modica uma estrutura ou variável de dados mutável, usa IO, lança uma exceção ou interrompe um erro... Todas essas coisas são consideradas efeitos colaterais. Marcos 'Tarski' Haskell
  27. Histories O que é ser funcional? Haskell #include <iostream> using

    namespace std; int main(){ int x = 1; int y = 0; y = ++x; cout << x << " " << y << endl; return 0; } Marcos 'Tarski' Haskell
  28. Histories O que é ser funcional? Haskell #include <iostream> int

    main() { int x = 1; x = x++; std::cout << x; return 0; } Marcos 'Tarski' Haskell
  29. Histories O que é ser funcional? Haskell #include <iostream> int

    main() { int x = 1; x = x++; std::cout << x; return 0; } Compilando com a ag -Wall: > g++ -Wall test.cpp -o test test.cpp: In function `int main()': test.cpp:6:12: warning: operation on `x' may be undefined [- x = x++; ^ Marcos 'Tarski' Haskell
  30. Histories O que é ser funcional? Haskell O estado é

    ruim? Puro = Libertário Na programação funcional o estado é OK! Você só deve evitar efeitos inesperados. Transparência referencial Basicamente: Uma expressão sempre retorna o mesmo resultado para um mesmo input. Marcos 'Tarski' Haskell
  31. Histories O que é ser funcional? Haskell Quando não ter

    estado é bom? h(f (x), g(x)) Se f e g são puras, então esse código é facilmente paralelizável. Marcos 'Tarski' Haskell
  32. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Como começar? Pode começar setando um ambiente no stack: Tutorial no medium Se você curtir docker, tem uma imagem ocial do Haskell no dockerhub. Marcos 'Tarski' Haskell
  33. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Marcos 'Tarski' Haskell
  34. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Marcos 'Tarski' Haskell
  35. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Marcos 'Tarski' Haskell
  36. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Marcos 'Tarski' Haskell
  37. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Tipos Marcos 'Tarski' Haskell
  38. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Tipos Um tipo é uma coleção de valores relacionados, por exemplo, o tipo Bool contém dois valores lógicos True e False. Usamos a notação v :: T para denotar que v é um valor no tipo T. Um comando bem útil no GHCi é o :t, que retorna o tipo de um valor em Haskell. Marcos 'Tarski' Haskell
  39. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for hel Prelude> :t 1 1 :: Num t => t Prelude> :t 'a' 'a' :: Char Prelude> :t "aaaaa" "aaaaa" :: [Char] Prelude> :t True True :: Bool Prelude> :t ('a', 1) ('a', 1) :: Num t => (Char, t) Prelude> let f = \x -> x Prelude> :t f f :: t -> t Prelude> Marcos 'Tarski' Haskell
  40. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions if 2 < 3 then 'A' else False Marcos 'Tarski' Haskell
  41. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions if 2 < 3 then 'A' else False "Ill-Typed!"(Mal tipado) Marcos 'Tarski' Haskell
  42. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Funções Inx >>> 4 `div` 2 2.0 >>> mod 3 2 1 >>> 3 `mod` 2 1 >>> (+) 2 2 4 Marcos 'Tarski' Haskell
  43. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions >>> def f(): ... return 1 ... >>> type(f) <class 'function'> >>> Marcos 'Tarski' Haskell
  44. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Tipos de funções Em Haskell, o tipo de funções é representado por uma seta →. O tipo Bool → Bool representa todas as funções que recebem um Boolean e retornam um booleano. not :: Bool → Bool isDigit :: Char → Bool. Marcos 'Tarski' Haskell
  45. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Currying -- Seguindo essa lógica, a função soma teria o seguinte tipo soma :: (Int, Int) -> Int soma x y = x + y -- Produto de 3 inteiros prod :: (Int, Int, Int) -> Int prod x y z = x * y * z Marcos 'Tarski' Haskell
  46. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Currying soma :: Int -> (Int -> Int) soma x y = x + y prod :: Int -> (Int -> (Int -> Int)) prod x y z = x*y*z Marcos 'Tarski' Haskell
  47. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Aplicação de funções f x y z = ((f x) y) z Marcos 'Tarski' Haskell
  48. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Listas Tipos em Listas De forma bem intuitiva, uma lista L que contém valores v do tipo t possui tipo [t]. Ou seja: v :: t =⇒ L :: [t]. Marcos 'Tarski' Haskell
  49. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions ['a', 'b', 'c'] :: [Char] "abc" :: [Char] Marcos 'Tarski' Haskell
  50. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Operações em listas >>> let a = [1, 2, 3] >>> head a 1 >>> tail a [2, 3] >>> length a 3 >>> reverse a [3, 2, 1] Marcos 'Tarski' Haskell
  51. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Operações em listas >>> take 2 a [1, 2] >>> a !! 2 2 >>> let b = [4, 5, 6] >>> a ++ b [1, 2, 3, 4, 5, 6] >>> 1:[2, 3, 4] [1, 2, 3, 4] Marcos 'Tarski' Haskell
  52. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Ranges e Listas innitas >>> [1..10] [1,2,3,4,5,6,7,8,9,10] >>> [2, 4..10] [2,4,6,8,10] Marcos 'Tarski' Haskell
  53. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Listas Innitas >>> take 10 (cycle [1, 2, 3]) [1,2,3,1,2,3,1,2,3,1] >>> take 10 (repeat 1) [1,1,1,1,1,1,1,1,1,1] >>> take 10 [1..] [1,2,3,4,5,6,7,8,9,10] >>> let a = 1:a >>> take 10 a [1,1,1,1,1,1,1,1,1,1] Marcos 'Tarski' Haskell
  54. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Lists Comprehension >>> [2 * x | x <- [1..10]] [2,4,6,8,10,12,14,16,18,20] >>> [x | x <- [1..20], x `mod` 2 == 0] [2,4,6,8,10,12,14,16,18,20] >>> sum [1 | x <- [1..10]] 10 Marcos 'Tarski' Haskell
  55. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Pattern Matching sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Marcos 'Tarski' Haskell
  56. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Pattern Matching sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs -- Maneira menos eficiente de fazer pattern matching sum :: [Int] -> Int sum [] = 0 sum [x] = x sum [x, y] = x + y sum (x:xs) = x + sum xs Marcos 'Tarski' Haskell
  57. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Polimorsmo Uma função é dita polimórca ("muitas formas") se o seu tipo contém um ou mais tipos. Marcos 'Tarski' Haskell
  58. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions length :: [a] -> Int length [] = 0 length (x:xs) = 1 + length xs -- Função constante -- Note que o tipo dela inclui tipos -- que não são a Prelude> :t const const :: a -> b -> a Marcos 'Tarski' Haskell
  59. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Funções de Ordem Superior Uma função f é dita de Ordem Superior se ela toma uma função como argumento ou retorna uma função. Marcos 'Tarski' Haskell
  60. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Funções de Ordem Superior Uma função f é dita de Ordem Superior se ela toma uma função como argumento ou retorna uma função. twice :: (a -> a) -> a -> a twice f a = f (f a) Marcos 'Tarski' Haskell
  61. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Map map :: (a -> b) -> [a] -> [b] Marcos 'Tarski' Haskell
  62. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Map map :: (a -> b) -> [a] -> [b] -- No GHCi Prelude> map (+1) [1..10] [2,3,4,5,6,7,8,9,10,11] Marcos 'Tarski' Haskell
  63. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Map map :: (a -> b) -> a -> b map f [] = [] map f (x:xs) = f x : map f xs Marcos 'Tarski' Haskell
  64. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Filter filter :: (a -> Bool) -> [a] -> [a] > filter even [1..10] [2,4,6,8,10] Marcos 'Tarski' Haskell
  65. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Filter filter :: (a -> Bool) -> [a] -> [a] filter f [] = [] filter f (x:xs) = | f x = x : filter f xs | otherwise = filter f xs Marcos 'Tarski' Haskell
  66. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldr -- Lista Vazia (caso base) = v f [] = v f (x:xs) = x # f xs -- Onde '#' é alguma operação nos elementos da lista Marcos 'Tarski' Haskell
  67. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldr 1 : (2 : (3 : []) ) Foldr => Marcos 'Tarski' Haskell
  68. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldr 1 : (2 : (3 : []) ) Foldr => 1 # (2 # (3 # v) ) Marcos 'Tarski' Haskell
  69. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldr 1 : (2 : (3 : []) ) Foldr => 1 # (2 # (3 # v) ) foldr (#) v [x0, x1, ..., xn] = x0 # (x1 # (... # xn # v) ... )) Marcos 'Tarski' Haskell
  70. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldl -- Lista Vazia (caso base) = v f v [] = v f v (x:xs) = f (v # x) xs -- Onde '#' é alguma operação nos elementos da lista Marcos 'Tarski' Haskell
  71. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Foldl -- Lista Vazia (caso base) = v f v [] = v f v (x:xs) = f (v # x) xs -- Onde '#' é alguma operação nos elementos da lista Marcos 'Tarski' Haskell
  72. Histories O que é ser funcional? Haskell Tipos Tipos de

    funções Listas Ranges Listas innitas List Comprehension Pattern Matching Funções Polimórcas High Order Functions Denindo seus próprios datatypes data Color = Red | Green | Blue data Shape = Circle Float Float Float | Rectangle Float Floa O que é bem mais natural do que em C, por exemplo: #define RED 0 #define GREEN 1 #define BLUE 2 Marcos 'Tarski' Haskell