33
Programação Funcional Aula 2 Primeiros Passos José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011.2 José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 1 / 33

Aula2 PrimeirosPassos - DECOM fileAula2 PrimeirosPassos JoséRomildoMalaquias ... 2011.2 JoséRomildoMalaquias (UFOP) PF-01Primeirospassos 2011.2 1/33. ... PF-01Primeirospassos 2011.2

Embed Size (px)

Citation preview

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

José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 2 / 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

Fim

José Romildo Malaquias (UFOP) PF-01 Primeiros passos 2011.2 33 / 33