VinBR

LP 21/09/2011

Sep 29th, 2011
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.50 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. // A aula de hoje vai falar sobre tipos de dados
  9.  
  10. Declarando um tipo boolean:
  11.  
  12. datatype bool = true | false;
  13.  
  14. // Parece que true e false são palavras reservadas, mas bool não é e precisa ser definida.
  15.  
  16. Outro exemplo:
  17.  
  18. datatype day = dom | seg | ter | qua | qui | sex | sab;
  19.  
  20. Estes tipos são chamados de tipos algebricos dentro de linguagens funcionais e mais especificamente dentro do SML chamamos de uniões disjuntas rotuladas.
  21.  
  22. Porque disjuntas? porque cada membro dessa união é um conjunto sem intercessões com nenhum outro conjunto da mesma enumeração.
  23. // ou seja eu não posso fazer nenhuma operação do tipo dom < seg, pois isso não faz sentido a principio já que as uniões nenhuma relação entre sí.
  24.  
  25. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  26.  
  27. Ex interessante:
  28. Como poderiamos fazer para expressar +infinito e -infinito em SML?,
  29. já que apesar de termos o tipo inteiro, quando ocorre um overflow seu valor fica apenas confuso e chamar isso de +infinito ou -infinito seria uma solução prática.
  30.  
  31. datatype exint = MinusInf | PlusInf | Value of int
  32.  
  33. Value no caso é tranformado num "construtor de dados", que recebe um inteiro e retorna um tipo exint
  34. exint é um construtor de tipo.
  35.  
  36. CONCEITO:
  37. Construtor de Dados é diferente de construtor de tipos, mas também funciona de forma semelhante a uma função.
  38. Um Construtor de Dados é definido na declaração de um rotulo de um datatype e utiliza-se a palavra reservada "of" para associa-lo a um tipo.
  39. Assim ele recebe um tipo como parâmetro (como no exemplo acima) e retorna um datatype, no caso o exint.
  40.  
  41. Assim se eu escrevo Value 10 em uma função eu estou na verdade me referindo ao tipo exint no conjunto de Values referente especificamente ao valor 10.
  42.  
  43. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  44.  
  45. Como fazer uma função para calcular o quadrado de um inteiro retornando um exint e lidando com overflows?
  46.  
  47. // No caso vamos considerar que o parâmetro é um exint ao inves de um inteiro, para simplificar.
  48.  
  49. fun square PlusInf = PlusInf
  50. | square MinusInf = PlusInf
  51. | square (Value x) = Value (x*x)
  52. handle Overflow => PlusInf;
  53. // Parece que handle é o pegador de excessões do SML.
  54.  
  55. Então repare que o rotulo Value, se parece muito com uma função, então qual a diferença??
  56. A diferença é que eu posso usar um rotulo para casamento de padrão, mas não posso usar uma função para isso.
  57. Voces viram como eu usei (Value x) para que x denotasse o inteiro contido no exint de parâmetro?
  58. Interessante não?
  59.  
  60. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  61.  
  62. O casamento de padrão é um açucar sintatico sobre a ferramenta case veja:
  63.  
  64. val s = case x of
  65. PlusInf => "inf"
  66. MinusInf => "-inf"
  67. value y => Int.toString y;
  68.  
  69. // então note que o case realiza exatamente o mesmo processo que um casamento de padrão.
  70. // Porém pode ser usado em uma variável como no exemplo acima.
  71. // A variável s conterá portanto uma string denotando o valor da variável x.
  72.  
  73. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  74.  
  75. datatype 'a opt = NONE | SOME of 'a
  76.  
  77. Pode-se usar isso por exemplo para gerar a função:
  78.  
  79. fun optdiv a 0 = NONE
  80. | optdiv a b = SOME(a div b)
  81.  
  82. Assim posso retornar um sinal de "erro" ou de "invalidez" quando a divisão não puder ser realizada.
  83. sinal esse que no caso eu chamo de NONE.
  84.  
  85. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86.  
  87. datatype 'b bunch = One of 'x | Group of 'x list
  88.  
  89. Que pode representar conjuntos unitários ou não de forma diferenciada.
  90.  
  91. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92.  
  93. Como criar uma função para descobrir o tamanho da um tipo bunch?
  94.  
  95. fun size (One _) = 1
  96. | size (Group l) = lenght l
  97.  
  98. // Pense em lenght como uma função para descobrir o comprimento de uma lista.
  99.  
  100. Ou seja em SML fica fácil trabalhar com estruturas de dados mais complexas, pois sempre consigo desconstrui-las
  101. em padrões mais simples e trabalhar apenas sobre eles usando o casamento de padrão.
  102.  
  103. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  104.  
  105. Observem uma notação importante, que pode causar erro se voce não entender bem:
  106.  
  107. datatype 'int opt = NONE | SOME of 'int
  108.  
  109. Funciona bem
  110.  
  111. mas:
  112.  
  113. datatype int opt = NONE | SOME of 'int
  114.  
  115. Da erro, pois um tipo deve sempre ter uma apostofre antes.
  116.  
  117. // Repare que eu redefini o valor de opt que agora só aceita inteiros.
  118.  
  119. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  120.  
  121. Vamos definir uma lista?
  122.  
  123. datatype intlist = IntNill | IntCons of int * intlist (recursivamente)
  124.  
  125. Legal né? e meio confuso.
  126.  
  127. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  128.  
  129. Mas essa lista só aceita inteiros vamos fazer uma que aceita qualquer tipo:
  130.  
  131. datatype 'a mylist = NIL | CONS of 'a * 'a intlist (recursivamente)
  132.  
  133. // o professor fez infixr 5 CONS, e de algum modo cons ganhou os mesmos poderes que os "::" porem funcionando sobre "mylist"
  134. // o professor escreveu algo antes, que não entendi.
  135. // Bem pensando a respeito do :: parece então que ele é também um construtor de dados que recebe um 'a e um 'a list assim como o CONS,
  136. // faz sentido haver um modo de fazer o cons se comportar da forma que o :: faz já que são totalmente analogos.
  137.  
  138. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  139.  
  140. Como se faz uma arvore?
  141.  
  142. datatype 'a tree = Empty | Node of 'a tree * 'a * 'a tree
  143.  
  144. Mole não?
  145.  
  146. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  147.  
  148. Agora o professor quer tranformar uma lista em uma arvore binaria balanceada veja:
  149. // não faço idéia da utilidade dessa função xP
  150.  
  151. fun toTree nil = Empty
  152. | toTree (h::t) =
  153. let
  154. fun halve nil = (nil, nil)
  155. | halve [e] = ([e], nil)
  156. | halve (a::b::t) =
  157. let
  158. (x,y) = halve t
  159. in
  160. (a::x, b::y)
  161. end
  162.  
  163. val (x,y) = halve t
  164.  
  165. in
  166. Node(toTree x, h, toTree y)
  167. end
  168.  
  169. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  170.  
  171. // bem a aula acabou, o professor escreveu mais algumas coisas, mas não cheguei a copiar tudo não. =/
Advertisement
Add Comment
Please, Sign In to add comment