aula2 primeirospassos - decom fileaula2 primeirospassos joséromildomalaquias ... 2011.2...
TRANSCRIPT
Programação Funcional
Aula 2Primeiros Passos
José Romildo Malaquias
Departamento de ComputaçãoUniversidade Federal de Ouro Preto
2011.2
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 1 / 33
GHC (Glasglow Haskell Compiler)
I GHC é um compilador e um ambiente interativo livre paraa linguagem funcional Haskell.
I GHC suporta toda a linguagem Haskell 2010 mais umagrande variedade de extensões.
I GHC tem suporte particularmente bom para aconcorrência e paralelismo.
I GHC gera código rápido, principalmente para programasconcorrentes. Dê uma olhada no desempenho GHC emThe Computer Language Benchmarks Game.
I GHC funciona em várias plataformas, incluindo Windows,Mac, Linux, a maioria das variedades de Unix, e váriasarquiteturas de processadores diferentes.
I GHC tem capacidades de otimização, incluindo otimizaçãoentre módulos.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 3 / 33
GHC (Glasglow Haskell Compiler) (cont.)
I GHC compila código Haskell diretamente para códigonativo ou pode usar LLVM como um back-end. GHCtambém pode gerar código C como um código intermédiopara portar para novas plataformas. O ambienteinterativo Haskell compila para bytecode, e suporta aexecução mista de bytecode e programas compilados.
I GHC suporta Profiling.I GHC vem com várias bibliotecas, e muitas outras estãodisponíveis no Hackage.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 4 / 33
Iniciando o ambiente interativo ghci
Em um sistema Unix, o ambiente interativo do GHC (ghci)pode ser iniciado a partir do prompt simplesmente digitandoghci:
$ ghciGHCi, version 7.2.1: http://www.haskell.org/ghc/ :? for helpLoading package ghc-prim ... linking ... done.Loading package integer-gmp ... linking ... done.Loading package base ... linking ... done.Loading package ffi-1.0 ... linking ... done.Prelude>
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 5 / 33
Iniciando o ambiente interativo ghci (cont.)
O prompt > significa que o sistema ghci está pronto paraavaliar expressões.Por exemplo:Prelude> 2 + 3 * 414Prelude> (2 + 3) * 420Prelude> sqrt (3^2 + 4^2)5.0
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 6 / 33
A biblioteca padrão (standard prelude)
I O arquivo de biblioteca Prelude.hs oferece um grandenúmero de funções standard.
I Além das funções familiares numéricos, tais como + e *, abiblioteca também oferece muitas funções úteis para aminipulação de listas.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 7 / 33
A biblioteca padrão (standard prelude) (cont.)
Seleciona o primeiro elemento de uma lista:Prelude> head [1,2,3,4,5]1
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 8 / 33
A biblioteca padrão (standard prelude) (cont.)
Remove o primeiro elemento de uma lista:Prelude> tail [1,2,3,4,5][2,3,4,5]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 9 / 33
A biblioteca padrão (standard prelude) (cont.)
Seleciona o n-ésimo elmento de uma lista:Prelude> [1,2,3,4,5] !! 23
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 10 / 33
A biblioteca padrão (standard prelude) (cont.)
Seleciona os primeiros n elementos de uma lista:Prelude> take 3 [1,2,3,4,5][1,2,3]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 11 / 33
A biblioteca padrão (standard prelude) (cont.)
Remove os primeiros n elementos de uma lista:Prelude> drop 3 [1,2,3,4,5][4,5]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 12 / 33
A biblioteca padrão (standard prelude) (cont.)
Calcula o tamanho de uma lista:Prelude> length [1,2,3,4,5]5
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 13 / 33
A biblioteca padrão (standard prelude) (cont.)
Calcula a soma de uma lista de números:Prelude> sum [1,2,3,4,5]15
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 14 / 33
A biblioteca padrão (standard prelude) (cont.)
Calcula o produto de uma lista de números:Prelude> product [1,2,3,4,5]120
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 15 / 33
A biblioteca padrão (standard prelude) (cont.)
Concatena duas listas:Prelude> [1,2,3] ++ [4,5][1,2,3,4,5]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 16 / 33
A biblioteca padrão (standard prelude) (cont.)
Inverte uma lista:Prelude> reverse [1,2,3,4,5][5,4,3,2,1]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 17 / 33
Function Application
Em Matemática, aplicação de função é denotada usandoparênteses, e multiplicação é muitas vezes denotado usandojustaposição ou espaço.
f (a,b) + cd
Aplica a função f aos argumentos a e b, e adiciona o resultadoao produto de c e d.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 18 / 33
Function Application (cont.)
Em Haskell, aplicação de função é denotada usando o espaço,e multiplicação é indicado pelo operador *.f a b + c * dTal como anteriormente, mas na sintaxe Haskell.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 19 / 33
Function Application (cont.)
Além disso, aplicação de função tem prioridade maior do quetodos os outros operadores.f a + bSignifica(f a) + b
em vez def (a + b)
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 20 / 33
Function Application (cont.)
Exemplos:
Matemática Haskellf (x) f xf (x,y) f x yf (g(x)) f (g x)f (x,g(y)) f x (g y)f (x)g(y) f x * g y
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 21 / 33
Scripts Haskell
I Além das funções no prelúdio padrão, o programadortambém pode definir suas próprias funções.
I Novas funções são definidas dentro de um script, umarquivo de texto compreendendo uma seqüência dedefinições.
I Por convenção, scripts Haskell normalmente têm umaextensão .hs em seu nome. Isso não é obrigatório, mas éútil para fins de identificação.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 22 / 33
Meu primeiro script
I Ao desenvolver um script Haskell, é útil manter duasjanelas abertas, uma executando um editor para o script,e outra para o GHCi em execução.
I Inicie um editor de texto, digite as seguintes definições defunção, e salve o script como test.hs:double x = x + x
quadruple x = double (double x)
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 23 / 33
Meu primeiro script (cont.)
I Deixando o editor aberto, em outra janela execute o GHCicom o novo script:$ ghci test.hsGHCi, version 7.2.1: http://www.haskell.org/ghc/ :? for helpLoading package ghc-prim ... linking ... done.Loading package integer-gmp ... linking ... done.Loading package base ... linking ... done.Loading package ffi-1.0 ... linking ... done.[1 of 1] Compiling Main ( test.hs, in-terpreted )Ok, modules loaded: Main.*Main>
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 24 / 33
Meu primeiro script (cont.)
I Agora, tanto Prelude.hs como test.hs são carregados, efunções de ambos os scripts podem ser usadas:*Main> quadruple 1040*Main> take (double 2) [1,2,3,4,5,6][1,2,3,4]
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 25 / 33
Meu primeiro script (cont.)
I Deixando GHCi aberto, volte para o editor, adicione asseguintes duas definições, e salve:factorial n = product [1..n]
average ns = sum ns ‘div‘ length nsI Observe que:
div é colocado entre apóstrofe para trás, e não para afrente;x ‘f‘ y é apenas abreviação sintática para f x y.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 26 / 33
Meu primeiro script (cont.)
I GHCi não detecta automaticamente que o script foialterado. Assim um comando reload deve ser executadoantes de as novas definições poderem ser usadas:*Main> :reload[1 of 1] Compiling Main ( test.hs, in-terpreted )Ok, modules loaded: Main.*Main> factorial 103628800*Main> average [1,2,3,4,5]3
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 27 / 33
Identificadores
I Nomes de função e argumentos devem começar com umaletra minúscula. Por exemplo:myFun, fun1, arg_2, x’
I Por convenção, uma lista de elementos normalmente têmum sufixo s em seu nome, que indica plural. Por exemplo:xs, ns, nss
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 28 / 33
A regra de layout
Em uma seqüência de definições, cada definição devecomeçar precisamente na mesma coluna:a = 10b = 20c = 30
a = 10b = 20
c = 30
a = 10b = 20
c = 30
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 29 / 33
A regra de layout (cont.)A regra de layout evita a necessidade de uma sintaxeexplícita para indicar o agrupamento de definições.- agrupamento implicitoa = b + c
whereb = 1c = 2
d = a * 2significa- agrupamento explicitoa = b + c
where{b = 1;c = 2}
d = a * 2
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 30 / 33
Comandos úteis do GHCi
comando significado:load name carrega o script name:reload recarrega o script atual:edit name edita o script name:edit edita o script atual:type expr mostra o tipo de expr:? mostra todos os comandos:quit termina o GHCi
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 31 / 33
Exercícios1 Experimente os exemplos apresentados nos slides usandoo GHCi.
2 Corrija os erros de sintaxe no programa abaixo, e testesua solução usando o GHCi.N = a ’div’ length xs
wherea = 10
xs = [1,2,3,4,5]3 Mostre como a função de biblioteca last que seleciona oúltimo elemento de uma lista pode ser definida de acordocom as funções introduzidas nesta aula.
4 Você pode pensar em outra possível definição?5 Da mesma forma, mostrar como a função de biblioteca
init, que remove o último elemento de uma lista podeser definida de duas maneiras diferentes.
José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 32 / 33