Sie sind auf Seite 1von 13

Programao Funcional UFOP DECOM 20142

Aula prtica 1
O Ambiente Interativo GHCi
Resumo
As atividades de programao sero desenvolvidas usando a linguagem Haskell (http://www.haskell.
org/).
Nesta aula o aluno dever se familiarizar com o ambiente de programao em Haskell atravs da avaliao de
expresses no ambiente interativo. Tambm ele ir aprender a fazer suas primeiras denies de funo.
Sumrio
1 O ambiente interativo GHCi 1
2 Constantes 3
3 Aplicao de funo 4
4 Nomeando valores 7
5 Bibliotecas 7
6 Avaliando expresses 8
7 Denindo variveis e funes 9
8 Comentrios 11
9 Regra de layout 11
10 Comandos teis do GHCi 12
11 Denindo funes 12
1 O ambiente interativo GHCi
Haskell uma linguagem de programao puramente funcional avanada. um produto de cdigo aberto de
mais de vinte anos de pesquisa de ponta que permite o desenvolvimento rpido de software robusto, conciso e
correto. Com um bom suporte para a integrao com outras linguagens, concorrncia e paralelismo integrados,
depuradores, bibliotecas ricas, e uma comunidade ativa, Haskell torna mais fcil a produo de software exvel, de
alta qualidade de fcil manuteno.
A Plataforma Haskell (http://www.haskell.org/platform/) um ambiente de desenvolvimento abran-
gente e robusto para a programao em Haskell. Ela formada pelo compilador GHC (Glasgow Haskell Compiler:
http://www.haskell.org/ghc/) e por vrias bibliotecas prontas para serem usadas. O GHC compreende um
compilador de linha de comando (ghc) e tambm um ambiente interativo (GHCi), que permite a avaliao de
expresses de forma interativa.
A Plataforma Haskell deve estar instalada em seu computador para desenvolvermos as atividades de programa-
o deste curso.
O GHCi pode ser iniciado a partir de um terminal simplesmente digitando ghci. Isto ilustrado na gura
seguinte, em um sistema Unix.
1
No Windows pode-se iniciar o GHCi de maneira semelhante, a partir da janela Prompt de Comandos.
No Windows o programa WinGHCi h uma alternativa para executar o GHCi sem usar um terminal. Este programa
tem uma janela prpria, alm de uma barra de ferramentas e uma barra de menus que podem facilitar algumas ope-
raes no ambiente interativo. O WinGHCi pode ser iniciado a partir do menu do Windows. Prompt de Comandos.
2
O prompt > signica que o sistema GHCi est pronto para avaliar expresses.
Uma aplicao Haskell formada por um conjunto de mdulos contendo denies de tipos, variveis, funes,
etc. esquerda do prompt mostrada a lista de mdulos abertos (importados). Ummdulo formado por denies
que podem ser usadas em outros mdulos. O mdulo Prelude da biblioteca padro do Haskell contm vrias
denies bsicas e importado automaticamente tanto no ambiente interativo quanto em outros mdulos.
Expresses Haskell podem ser digitadas no prompt. Elas so compiladas e avaliadas, e o seu valor exibido.
Por exemplo:
Prelude> 2 + 3 * 4
14
Prelude> (2 + 3) * 4
20
Prelude> sqrt (3^2 + 4^2)
5.0
O GHCi tambm aceita comandos que permite congur-lo. Estes comandos comeam com o caracter :.
Pode-se obter ajuda no GHCi com os comandos :help ou :?.
O comando :quit pode ser usado para encerrar a sesso interativa no GHCi.
Tarefa 1
Use o ambiente interativo GHCi para avaliar todas as expresses usadas nos exemplos deste roteiro.
2 Constantes
As formas mais simples de expresses so construtores constantes e literais, que representam valores em sua
forma mais simples, ou seja, j esto reduzidos sua forma cannica. Os literais so expresses comsintaxe especial
para escrever alguns valores. J construtores constantes so identicadores comeando com letra maiscula.
Veja alguns exemplos de construtores constantes e literais na tabela a seguir.
3
descrio exemplo
literais numricos
inteiros
em decimal 8743
em octal
0o7464
0O103
em hexadecimal
0x5A0FF
0xE0F2
fracionrios em decimal
140.58
8.04e7
0.347E+12
5.47E-12
47e22
literais caracter
H
\n
\x65
literais string
"bom dia"
"ouro preto\nmg"
construtores booleanos
False
True
Os literais numricos so sempre positivos.
3 Aplicao de funo
Aplicao de funo uma das formas de expresses mais comuns na programao funcional, uma vez que os
programas so organizados em funes.
Sintaticamene uma aplicao de funo em notao prexa consiste em escrever a funo seguida dos argu-
mentos, se necessrio separados por caracteres brancos (espaos, tabuladores, mudana de linha, etc.).
Exemplos:
Prelude> sqrt 25
5.0
Prelude> cos 0
1.0
Prelude> tan pi
-1.2246467991473532e-16
Prelude> exp 1
2.718281828459045
Prelude> logBase 3 81
4.0
Prelude> log 10
2.302585092994046
Prelude> mod 25 7
4
Prelude> negate 7.3E15
-7.3e15
Prelude> not True
False
Observe que, diferentemente de vrias outras linguagens de programao, os argumentos no so escritos
entre parnteses e nem separados por vrgula.
Parnteses podem ser usados para agrupar subexpresses. Por exemplo:
Prelude> sqrt (logBase 3 81)
2.0
Prelude> logBase (sqrt 9) 81
4.0
Aplicaes de funo tambm podem ser escritas em notao inxa, onde a funo escrita entre os seus
argumentos. Neste caso dizemos que as funes so operadores inxos. Exemplos:
4
Prelude> 2 + 3
5
Prelude> 10 / 4
2.5
Prelude> (12 - 7) * 6
30
Prelude> 5 * sqrt 36
30.0
Prelude> 6 <= 17
True
Prelude> A == B
False
Prelude> A /= B
True
Prelude> True || False
True
Prelude> True && False
False
Assim como na Matemtica e em outras linguagens de programao, os operadores possuem um nvel de pre-
cedncia (ou prioridade) e uma associativade. Parnteses podem ser usados para agrupar subexpresses dentro de
expresses maiores quebrando a precedncia ou associatividade dos operadores.
Onvel de precedncia de um operador dado por um nmero entre 0 e 9, inclusive. Se dois operadores disputam
um operando, o operador de maior precedncia escolhido.
A tabela 1 listas os operadores denidos no preldio.
precedncia associativade operador descrio
9 esquerda !! ndice de lista
direita . composio de funes
8 direita ^ potenciao com expoente inteiro no negativo
^^ potenciao com expoente inteiro
** potenciao com expoente em ponto utuante
7 esquerda * multiplicao
/ diviso fracionria
div quociente inteiro truncado em direo a inf
mod mdulo inteiro satisfazendo (div x y)*y + (mod x y) == x
quot quociente inteiro truncado em direo a 0
rem resto inteiro satisfazendo (quot x y)*y + (rem x y) == x
6 esquerda + adio
- subtrao
5 direita : construo de lista no vazia
++ concateno de listas
4 no associativo == igualdade
/= desigualdade
< menor que
<= menor ou igual a
> maior que
>= maior ou igual a
elem pertinncia de lista
notElem negao de pertinncia de lista
3 direita && conjuno (e lgico)
2 direita || disjuno (ou lgico)
1 esquerda >> composio de aes sequenciais descartando o resultado da primeira
>>= composio de aes sequenciais
0 direita $ aplicao de funo
$! aplicao de funo estrita
seq avaliao estrita
Tabela 1: Precedncias e associatividades dos operadores do Prelude.
Exemplos:
5
Prelude> 2 + 3 * 4 -- * tem maior precedncia que +
14
Prelude> 5 ^ 2 - 10 -- ^ tem maior precedncia que -
15
Prelude> 2 ^ 3 ^ 2 -- ^ associa-se direita
512
Aplicaes de funo em notao prexa tem prioridade maior do que todos os operadores. Exemplos:
Prelude> abs 10 - 20 -- abs tem precedncia maior que -
-10
Prelude> abs (10 - 20)
10
Prelude> succ 9 + max 5 4 * 3 -- succ e max tem precedncia maior que + e *
25
Prelude> 2 * logBase (8/2) 256 + 1000
1008.0
Um operador pode ser associativo esquerda, associativo direita, ou no-associativo. Quando dois operadores
com a mesma precedncia disputam um operando,
se eles forem associativos esquerda, o operador da esquerda escolhido,
se eles forem associativos direita, o operador da direta escolhido,
se eles forem no associativos, a expresso mal formada e contm um erro de sintaxe,
Exemplos:
Prelude> 15 - 4 - 6 -- - associa-se esquerda
5
Prelude> 15 - (4 - 6)
17
Prelude> 10 - 2 + 5 -- + e - tem a mesma precedncia e associam-se esquerda
13
Prelude> 10 - (2 + 5)
3
Prelude> 2^3^4 -- ^ associa-se direita
2417851639229258349412352
Prelude> (2^3)^4
4096
Prelude> 3 > 4 > 5 -- > no associativo
erro de sintaxe
O smbolo - merece ateno especial, pois ele pode tanto ser a funo de subtrao (operador inxo) como a
funo de inverso de sinal (operador prexo).
Prelude> 6 - 2
4
Prelude> - 5
-5
Prelude> - (5 - 9)
4
Prelude> negate (5 - 9)
4
Prelude> 4 * (-3)
-12
Prelude> 4 * -3
erro de sintaxe
A notao prexa usada com nomes de funes que so identicadores alfanumricos: formados por uma
sequncia de letras, dgitos decimais, sublinhado (_) e apstrofo () comeando com letra minscula ou sublinhado
(e que no seja uma palavra reservada).
6
J a notao inxa usada com nomes de funes simblicos: formados por uma sequncia de smbolos espe-
ciais (! # $ % & + . / < = > ? @ | \ ^ - ~ :) que no comea com :.
Qualquer operador pode ser usado em notao prexa, bastando escrev-lo entre parnteses. Exemplos:
Prelude> (+) 4 5
9
Prelude> (/) 18.2 2
9.1
Prelude> (>=) 10 20
False
Prelude> sqrt ((+) 4 5)
3
Qualquer funo prexa de dois argumentos pode ser usada em notao inxa, bastando escrev-la entre aps-
trofos invertidos (sinal de crase: ), com precedncia padro 9 e associativade esquerda. Exemplos:
Prelude> 20 div 3
6
Prelude> 20 mod 3
2
Prelude> 20 mod 3 == 0
False
Prelude> 3 logBase 81
4.0
Prelude> (3 logBase 81) ^ 2
16.0
Prelude> 3 logBase (81 ^ 2)
8.0
Prelude> 3 logBase 81 ^ 2
16.0
Prelude> (20 div 3) ^ 2
36
Prelude> 20 div 3 ^ 2
2
4 Nomeando valores
Quando uma expresso avaliada diretamente no ambiente interativo, uma varivel chamada it automatica-
mente denida para denotar o valor da expresso. Exemplo:
Prelude> 2 + 3 * 4
14
Prelude> it
14
Prelude> 7*(it - 4)
70
Prelude> it
70
Uma declarao let pode ser usada para denir uma varivel no ambiente interativo. Por exemplo:
Prelude> let idade = 2 + 3 * 4
Prelude> idade
14
Prelude> 7*(idade - 4)
70
5 Bibliotecas
Os programas em Haskell so organizados em mdulos. Um mdulo formado por um conjunto de deni-
es (tipos, variveis, funes, etc.). Para que as denies de um mdulo possam ser usadas o mdulo deve ser
importado. Uma biblioteca formada por uma coleo de mdulos relacionados.
7
A biblioteca padro (http://www.haskell.org/onlinereport/haskell2010/haskellpa2.html for-
mada por umconjunto de mdulos disponvel emtdas as implementaes de Haskell. Ela contmo mdulo Prelude
(http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html) que importado au-
tomaticamente por padro em todas os programas em Haskell e contm tipos e funes comumente usados.
A biblioteca padro do GHC (http://www.haskell.org/ghc/docs/latest/html/libraries/index.html) uma verso
expandida da biblioteca padro contendo alguns mdulos adicionais.
As bibliotecas da Plataforma Haskell (http://www.haskell.org/platform/) so bibliotecas adicionais
includas na plataforma Haskell.
Hackage (http://hackage.haskell.org/) uma coleo de pacotes contendo bibliotecas disponibilizados pela co-
munidade. Estes pacotes podem ser instalados separadamente.
Todas as denies de um mdulo podem ser listadas no ambiente interativo usando o comando :browse.
Exemplo:
Prelude> :browse Prelude
($!) :: (a -> b) -> a -> b
(!!) :: [a] -> Int -> a
($) :: (a -> b) -> a -> b
(&&) :: Bool -> Bool -> Bool
(++) :: [a] -> [a] -> [a]
(.) :: (b -> c) -> (a -> b) -> a -> c
(=<<) :: Monad m => (a -> m b) -> m a -> m b
data Bool = False | True
.
.
.
6 Avaliando expresses
Tarefa 2: Movimento Retilnio Uniformementne Variado
A posio s de um corpo em movimento retilnio uniformemente variado, em funo do tempo t, dado pela
equao
s = s
0
+ v
0
t +
1
2
at
2
onde s
0
a posio inicial do corpo, v
0
a sua velocidade inicial, e a a sua acelarao.
Utilize o ambiente interativo GHCi para calcular a posio de uma bola em queda livre no instante t = 8 s,
considerando que a posio inicial s
0
= 100 m, a velocidade inicial v
0
= 15 m/s e a acelarao da gravidade
a = 9.81 m/s
2
.
Dica:
Use a declarao let para criar variveis correspondentes aos dados e em seguida avalie a expresso correspon-
dente funo horria do movimento usando estas variveis.
Tarefa 3: Expresses matemticas
Utilize o ambiente interativo para avaliar as expresses aritmticas seguintes, considerando que x = 3 e y = 4.
1.
4
3
sin x
2
1
2.
x
2
y
3
(x y)
2
3.
1
x
2
y
e
4x
+
3

35
y

x y
4.
24 + 4.5
3
e
4.4
log
10
12560
8
5. cos
5
6
sin
2
7
8
+
tan (

6
ln 8)

7 + 2
7 Denindo variveis e funes
Alm de poder usar as funes das bibliotecas, o programador tambm pode denir e usar suas prprias funes.
Novas funes so denidas dentro de um script, um arquivo texto contendo denies (de variveis, funes, tipos,
etc.).
Por conveno, scripts Haskell normalmente tem a extenso .hs em seu nome. Isso no obrigatrio, mas
til para ns de identicao.
Variveis e funes so denidas usando equaes. No lado esquerdo de uma equao colocamos o nome da
varivel ou o nome da funo seguido de seus parmetros formais. No lado direito colocamos uma expresso cujo
valor ser o valor da varivel ou o resultado da funo quando a funo for aplicada em seus argumentos.
Nomes de funes e variveis podem ser:
alfanumricos
comeam com uma letra minscula ou sublinhado e podem conter letras, dgitos decimais, sublinhado
(_) e apstrofo (aspa simples )
so normalmente usados em notao prexa
exemplos:
myFun
fun1
arg_2
x
simblicos
formados por uma sequncia de smbolos e no podem comear com dois pontos (:)
so normalmente usados em notao inxa
exemplos:
<+>
===
$*=*$
+=
Ao desenvolver um script Haskell, til manter duas janelas abertas, uma executando um editor de texto para
editar o script, e outra para o ambiente interativo (GHCi) em execuo. No Linux h vrios editores de textos que
podem ser usados, como o gedit, ou o kate. Na gura seguinte vemos o gedit.
9
O editor de texto padro do Windows (Bloco de Notas) no recomendado, pois ele muito precrio para edio
de programas. Um editor melhor o Notepad++ (http://notepad-plus-plus.org/).
Os arquivos de programas em Haskell sempre devem ser salvos usando a codicao de caracteres UTF-8.
Tarefa 4: Meu primeiro script
Inicie um editor de texto, digite as seguintes denies de funo, e salve o script com o nome test.hs.
double x = x + x
quadruple x = double (double x)
Deixando o editor aberto, em outra janela execute o GHCi carregando o novo script:
$ ghci test.hs
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main>
Agora, tanto Prelude.hs como test.hs so carregados, e as funes de ambos os scripts podemser usadas:
*Main> quadruple 10
40
*Main> 5*(double 2) - 3
17
Observe que o GHCi usa o nome de mdulo Main se o script no dene o nome do mdulo.
Tarefa 5: Modicando o script
Deixando o GHCi aberto, volte para o editor, adicione as seguintes denies ao script test.hs, e salve-o.
areaCirculo r = pi * r^2
O GHCi no detecta automaticamente que o script foi alterado. Assim ocomando :reload deve ser executado
para que as novas denies possam ser usadas:
*Main> :reload
[1 of 1] Compiling Main ( test.hs, interpreted )
10
Ok, modules loaded: Main.
*Main> areaCirculo 5
78.53981633974483
8 Comentrios
Comentrios so usados para fazer anotaes no programa que podem ajudar a entender o funcionamento do
mesmo. Os comentrios so ignorados pelo compilador.
Um Comentrio de linha introduzido por -- e se estende at o nal da linha.
Um Comentrio de bloco delimitado por {- e -} . Comentrios de bloco podem ser aninhados.
9 Regra de layout
Em uma seqncia de denies, cada denio deve comear precisamente na mesma coluna:
a = 10
b = 20
c = 30
a = 10
b = 20
c = 30
a = 10
b = 20
c = 30
Se uma denio for escrita em mais de uma linha, as linhas subsequentes primeira devem comear em uma
coluna mais direita da coluna que comea a sequncia de denies.
a = 10 + 20 + 30 +
40 + 50 + 60
b = sum [10,20,30]
a = 10 + 20 + 30 +
40 + 50 + 60
b = sum [10,20,30]
a = 10 + 20 + 30 +
40 + 50 + 60
b = sum [10,20,30]
A regra de layout evita a necessidade de uma sintaxe explcita para indicar o agrupamento de denies usando
{, } e ;.
-- agrupamento implcito
a = b + c
where
b = 1
c = 2
d = a * 2
signica
-- agrupamento explcito
a = b + c
where { b = 1 ; c = 2 }
d = a * 2
Para evitar problemas com a regra de layout, recomendado no utilizar caracteres de tabulao para
indentao do cdigo fonte, uma vez que um nico caracterizar de tabulao pode ser apresentado na tela
como vrios espaos. O texto do programa vai aparentar estar alinhado na tela do computador, mas na
verdade pode no estar devido ao uso do tabulador.
No editor notepad++ voc deve desabilatar o uso de tabulao. Para tanto marque a opo para subs-
tituir tabulaes por espao, acessando o menu Conguraes -> Preferncias -> Menu de Lingua-
gens/Congurao de Abas -> Substituir por espao antes de editar o arquivo.
11
10 Comandos teis do GHCi
comando abrev signicado
:load name :l carrega o script name
:reload :r recarrega o script atual
:edit name :e edita o script name
:edit :e edita o script atual
:type expr :t mostra o tipo de expr
:info name :i d informaes sobre name
:browse Name d informaes sobre o mdulo Name, se ele estiver carregado
let id = exp associa a varivel id ao valor da expresso exp
:! comando executa comando do sistema
:help :h, :? lista completa dos comandos do GHCi
:quit :q termina o GHCi
11 Denindo funes
Nas tarefas seguintes, quando for solicitado para denir funes, elas devemser denidas emumscript e testadas
no GHCi.
Tarefa 6
Identique e orrija os erros de sintaxe no script que se segue.
N = a div length xs
where
a = 10
xs = [1,2,3,4,5]
Tarefa 7
Dena uma funo para calcular o quadrado do dobro do seu argumento.
Tarefa 8
Dena uma funo para calcular o dobro do quadrado do seu argumento.
Tarefa 9: Lados de um tringulo
Os lados de qualquer tringulo respeitam a seguinte restrio:
A soma dos comprimentos de quaisquer dois lados de um tringulo superior ao comprimento do
terceiro lado.
Escreva uma funo que receba o comprimento de trs segmentos de reta e resulte em um valor lgico indicando
se satisfazem esta restrio.
Tarefa 10: Energia armazenada em uma mola
A fora requerida para comprimir uma mola linear dada pela equao
F = kx
onde F a fora em N (Newton), x a compresso da mola em m (metro), e k a constante da mola em N/m.
A energia potencial armazenada na mola comprimida dada pela equao
E =
1
2
kx
2
onde E a energia em J (joule).
Dena funes para calcular a compresso e a energia potencial armazenada em uma mola, dadas a constante
elstica da mola e a fora usada para comprimi-la.
12
Tarefa 11: Custo da energia eltrica
Sabe-se que o quilowatt de energia eltrica custa um quinto do salrio mnimo. Dena uma funo que receba
o valor do salrio mnimo e a quantidade de quilowatts consumida por uma residncia, e resulta no valor a ser
pago com desconto de 15%.
Tarefa 12: Receptor de rdio
Uma verso simplicada da parte frontal de um receptor de rdio AM apresentada na gura abaixo. Esse
receptor composto por um circuito que contm um resistor R, um capacitor C e um indutor L conectados em
srie. O circuito conectado a uma antena externa e aterrado conforme mostra a gura.
Terra
R

+
V
R
C
L
Antena

+
V
0
O circuito permite que o rdio selecione uma estao especca dentre as que transmitem na faixa AM. Na
frequncia de resonncia do circuito, essencialmente todo o sinal V
0
da antena vai at o resistor, que representa o
resto do rdio. Em outras palavras, o rdio recebe seu sinal mais forte na frequncia de ressonncia. A frequncia
de ressonncia do circuito indutor-capacitor dada pela equao
f
0
=
1
2

LC
onde L a indutncia em H (henry) e C a capcitncia em F (farad).
Dena uma funo que receba a indutncia L e a capacitncia C, e resulta na frequncia de ressonncia desse
aparelho de rdio
Teste seu programa pelo clculo da frequncia do rdio quando L = 0, 25mH e C = 0, 10nF.
13

Das könnte Ihnen auch gefallen