VinBR

LP 14/09/2011

Sep 29th, 2011
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.18 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. // Falando mais de SML
  9.  
  10. fun addp(x,y) = x + y
  11. int * int -> int
  12.  
  13. fun add2 x y = x + y
  14. int -> int -> int
  15.  
  16. // Veja que a primeira função recebe uma tupla, e a segunda recebe apenas um inteiro como parâmetro.
  17. // Mas retorna uma segunda função que recebe um segundo inteiro como parâmetro.
  18.  
  19. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  20.  
  21. Agora suponha que existe um operador + em cálculo lambida.
  22.  
  23. Como escrever a função add?
  24. (<l>x <l>y x + y)
  25.  
  26. Repare que se eu der apenas um parametro eu gero outra função. Se esse parametro for 1 eu gerarei:
  27.  
  28. (<l>y 1 + y)
  29.  
  30. // Com isso aqui eu entendi muito melhor o que significam as funções de SML, porque de fato elas se parecem muito com as de cálculo lambida.
  31.  
  32. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  33.  
  34. Agora veja como escrever uma função associando seu nome a uma variável:
  35.  
  36. val inc = fn x => x+1
  37.  
  38. Porém eu não posso dentro dessa função usar o nome inc novamente, ou seja com esse tipo de declaração não haverá recursividade.
  39.  
  40. E portanto o "fun" é uma definição mais poderosa de função.
  41. // Ou ao menos mais prática né, pois acho q recursão não é pre-requesito para ser turing completo.
  42.  
  43. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  44.  
  45. Vamos descrever os números em SML da mesma forma que descrevemos para o cálculo lambida e ver o que acontece?
  46.  
  47. val UM = fn s => fn z => s z
  48. val DOIS = fn s => fn z => s ( s z )
  49. val TRES = fn s => fn z => s ( s ( s z ) )
  50. e assim por diante.
  51.  
  52. Agora criemos uma função que tranforme estes números em números decimais já existentes em SML.
  53.  
  54. É facil fazer essa função, já que esses números são o número de vezes que se chama a função parametro,
  55. então vamos contar esse número de chamadas, usando uma função que retorne +1 para cada chamada dela, ou seja a função de incremento:
  56.  
  57. val TRANS = fn s => s inc 0
  58.  
  59. E pronto.
  60. TRANS 2 -> 2 inc 0 -> (fn s => fn z => s (s z)) inc 0
  61.  
  62. -> (fn z => inc (inc z)) 0 -> inc (inc 0) -> inc 1 -> 2 em notação decimal!
  63.  
  64. Legal?
  65.  
  66. O professor gerou uma função NOT em SML assim como a função que criamos para calc. lambda na ultima aula,
  67. uma função multiplicação, adição, definiu True e False também da mesma forma, e e criou também um IF.
  68.  
  69. Notem bem, sendo-se capaz de somar, realizar desvios, e contabilizar números, temos uma linguagem que é turing completa.
  70.  
  71. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  72.  
  73. CONCEITO:
  74. Funções de Alta Ordem são funções que recebem outra função como parâmetro ou retornam uma como retorno.
  75.  
  76. Uma funçào de ordem 0 não recebe nem retorna nem uma funçào.
  77. ex:
  78. fun add (x,y) = x + y
  79.  
  80. Uma função que recebe ou retorne uma função é de ordem 1.
  81. ex:
  82. fun add2 x y = x + y
  83. // Só relembrando: Essa função "add2" le x e retorna uma função que então lê y e por fim retorna a soma de x+y.
  84.  
  85. Se uma função retorna uma função de ordem 0, sua ordem é 1, se retorna uma função de ordem 1 sua ordem é 2 e assim por diante.
  86.  
  87. Estas são então as funções de alta ordem.
  88.  
  89. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  90.  
  91. Seja agora a função map: Ela recebe uma função e uma lista, e aplica a função a cada posição da lista, ou seja:
  92.  
  93. fun map f l = f hd l map tl l
  94.  
  95. Ex de uso:
  96.  
  97. A função ord que recebe um caractere como parametro retorna o seu número em asc.
  98.  
  99. fun asc str = map ord explode(str)
  100.  
  101. assim é retornada uma lista contendo os números asc da string recebida como parametro.
  102.  
  103. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  104.  
  105. Outra função foldr: (fold right)
  106.  
  107. fun foldr func s nil = s
  108. fun foldr func s l = foldr func (func s hd l) (tl l)
  109. ('a * 'b -> 'b ) -> 'b -> 'a list -> 'b
  110.  
  111. Essa função aplica func sobre os elementos da lista 2 a 2.
  112. Ou seja, o parâmetro s deve ser originalmente chamado com um valor neutro em relação à função.
  113. Assim o que a foldr faz é aplicar s = (func s hd l) recursivamente até que l seja nula.
  114.  
  115. Existe o fold right e o fold left, foldr e foldl respectivamente.
  116. foldr: (a4(a3(a2(a1))))
  117. foldl: ((((a1)a2)a3)a4)
  118.  
  119. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  120.  
  121. Nota solta:
  122. Existe um operador que seja associativo mas não comutativo?
  123. Sim a concatenaçào
  124. E um que seja o contrário? isso pode cair na prova, existe sim mas ele nào disse qual.
  125. // Bem eu não consegui pensar em nada, espero que o professor num invente de cobrar isso em prova =/.
  126.  
  127. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  128.  
  129. fun filter _ nil = nil
  130. | filter f (h::t) = if f h then h :: filter f t else filter f t
  131.  
  132. // leq é lesser or equal
  133. fun leq a b = a <= b
  134.  
  135. // grt é maior que.
  136. fun grt a b = a > b
  137.  
  138. fun qsort nil = nil
  139. | qsort (h::t) = qsort (filter (leq h) t) @ [h] @ qsort (filter (grt h) t)
  140.  
  141. // Bem e é essa aula =]
  142. // Acho que esse quick sort nao funciona e esqueci de anotar a correçào que faria ela funcionar.
  143. // Bem eu q num vou corrigir isso xP
Advertisement
Add Comment
Please, Sign In to add comment