p01-ambiente-interativo

Upload: gilberto-mota

Post on 10-Oct-2015

2 views

Category:

Documents


0 download

TRANSCRIPT

  • 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 deexpresses no ambiente interativo. Tambm ele ir aprender a fazer suas primeiras definies 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 Definindo variveis e funes 9

    8 Comentrios 11

    9 Regra de layout 11

    10 Comandos teis do GHCi 12

    11 Definindo funes 12

    1 O ambiente interativo GHCi

    Haskell uma linguagem de programao puramente funcional avanada. um produto de cdigo aberto demais de vinte anos de pesquisa de ponta que permite o desenvolvimento rpido de software robusto, conciso ecorreto. 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 flexvel, dealta 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 umcompilador de linha de comando (ghc) e tambm um ambiente interativo (GHCi), que permite a avaliao deexpresses 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 figuraseguinte, 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 programatem 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 > significa que o sistema GHCi est pronto para avaliar expresses.Uma aplicao Haskell formada por um conjunto de mdulos contendo definies de tipos, variveis, funes,

    etc. esquerda do prompt mostrada a lista de mdulos abertos (importados). Um mdulo formado por definiesque podem ser usadas em outros mdulos. O mdulo Prelude da biblioteca padro do Haskell contm vriasdefinies 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 * 414Prelude> (2 + 3) * 420Prelude> sqrt (3^2 + 4^2)5.0

    O GHCi tambm aceita comandos que permite configur-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 suaforma mais simples, ou seja, j esto reduzidos sua forma cannica. Os literais so expresses com sintaxe especialpara escrever alguns valores. J construtores constantes so identificadores 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 0o74640O103

    em hexadecimal 0x5A0FF0xE0F2

    fracionrios em decimal

    140.588.04e70.347E+125.47E-1247e22

    literais caracterH\n\x65

    literais string "bom dia""ouro preto\nmg"

    construtores booleanos FalseTrue

    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 osprogramas so organizados em funes.

    Sintaticamene uma aplicao de funo em notao prefixa consiste em escrever a funo seguida dos argu-mentos, se necessrio separados por caracteres brancos (espaos, tabuladores, mudana de linha, etc.).

    Exemplos:

    Prelude> sqrt 255.0Prelude> cos 01.0Prelude> tan pi-1.2246467991473532e-16Prelude> exp 12.718281828459045Prelude> logBase 3 814.0Prelude> log 102.302585092994046Prelude> mod 25 74Prelude> negate 7.3E15-7.3e15Prelude> not TrueFalse

    Observe que, diferentemente de vrias outras linguagens de programao, os argumentos no so escritosentre parnteses e nem separados por vrgula.

    Parnteses podem ser usados para agrupar subexpresses. Por exemplo:

    Prelude> sqrt (logBase 3 81)2.0Prelude> logBase (sqrt 9) 814.0

    Aplicaes de funo tambm podem ser escritas em notao infixa, onde a funo escrita entre os seusargumentos. Neste caso dizemos que as funes so operadores infixos. Exemplos:

    4

  • Prelude> 2 + 35Prelude> 10 / 42.5Prelude> (12 - 7) * 630Prelude> 5 * sqrt 3630.0Prelude> 6 A == BFalsePrelude> A /= BTruePrelude> True || FalseTruePrelude> True && FalseFalse

    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 deexpresses maiores quebrando a precedncia ou associatividade dos operadores.

    O nvel de precedncia de um operador dado por um nmero entre 0 e 9, inclusive. Se dois operadores disputamum operando, o operador de maior precedncia escolhido.

    A tabela 1 listas os operadores definidos no preldio.

    precedncia associativade operador descrio9 esquerda !! ndice de lista

    direita . composio de funes8 direita ^ potenciao com expoente inteiro no negativo

    ^^ potenciao com expoente inteiro** potenciao com expoente em ponto flutuante

    7 esquerda * multiplicao/ diviso fracionriadiv quociente inteiro truncado em direo a infmod mdulo inteiro satisfazendo (div x y)*y + (mod x y) == xquot quociente inteiro truncado em direo a 0rem 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 maior que>= maior ou igual aelem pertinncia de listanotElem 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 sequenciais0 direita $ aplicao de funo

    $! aplicao de funo estritaseq avaliao estrita

    Tabela 1: Precedncias e associatividades dos operadores do Prelude.

    Exemplos:

    5

  • Prelude> 2 + 3 * 4 -- * tem maior precedncia que +14Prelude> 5 ^ 2 - 10 -- ^ tem maior precedncia que -15Prelude> 2 ^ 3 ^ 2 -- ^ associa-se direita512

    Aplicaes de funo em notao prefixa tem prioridade maior do que todos os operadores. Exemplos:

    Prelude> abs 10 - 20 -- abs tem precedncia maior que --10Prelude> abs (10 - 20)10Prelude> succ 9 + max 5 4 * 3 -- succ e max tem precedncia maior que + e *25Prelude> 2 * logBase (8/2) 256 + 10001008.0

    Um operador pode ser associativo esquerda, associativo direita, ou no-associativo. Quando dois operadorescom 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 esquerda5Prelude> 15 - (4 - 6)17Prelude> 10 - 2 + 5 -- + e - tem a mesma precedncia e associam-se esquerda13Prelude> 10 - (2 + 5)3Prelude> 2^3^4 -- ^ associa-se direita2417851639229258349412352Prelude> (2^3)^44096Prelude> 3 > 4 > 5 -- > no associativoerro de sintaxe

    O smbolo - merece ateno especial, pois ele pode tanto ser a funo de subtrao (operador infixo) como afuno de inverso de sinal (operador prefixo).

    Prelude> 6 - 24Prelude> - 5-5Prelude> - (5 - 9)4Prelude> negate (5 - 9)4Prelude> 4 * (-3)-12Prelude> 4 * -3erro de sintaxe

    A notao prefixa usada com nomes de funes que so identificadores alfanumricos: formados por umasequncia de letras, dgitos decimais, sublinhado (_) e apstrofo () comeando com letra minscula ou sublinhado(e que no seja uma palavra reservada).

    6

  • J a notao infixa 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 prefixa, bastando escrev-lo entre parnteses. Exemplos:

    Prelude> (+) 4 59Prelude> (/) 18.2 29.1Prelude> (>=) 10 20FalsePrelude> sqrt ((+) 4 5)3

    Qualquer funo prefixa de dois argumentos pode ser usada em notao infixa, bastando escrev-la entre aps-trofos invertidos (sinal de crase: ), com precedncia padro 9 e associativade esquerda. Exemplos:

    Prelude> 20 div 36Prelude> 20 mod 32Prelude> 20 mod 3 == 0FalsePrelude> 3 logBase 814.0Prelude> (3 logBase 81) ^ 216.0Prelude> 3 logBase (81 ^ 2)8.0Prelude> 3 logBase 81 ^ 216.0Prelude> (20 div 3) ^ 236Prelude> 20 div 3 ^ 22

    4 Nomeando valores

    Quando uma expresso avaliada diretamente no ambiente interativo, uma varivel chamada it automatica-mente definida para denotar o valor da expresso. Exemplo:

    Prelude> 2 + 3 * 414Prelude> it14Prelude> 7*(it - 4)70Prelude> it70

    Uma declarao let pode ser usada para definir uma varivel no ambiente interativo. Por exemplo:

    Prelude> let idade = 2 + 3 * 4Prelude> idade14Prelude> 7*(idade - 4)70

    5 Bibliotecas

    Os programas em Haskell so organizados em mdulos. Um mdulo formado por um conjunto de defini-es (tipos, variveis, funes, etc.). Para que as definies de um mdulo possam ser usadas o mdulo deve serimportado. Uma biblioteca formada por uma coleo de mdulos relacionados.

    7

  • A biblioteca padro (http://www.haskell.org/onlinereport/haskell2010/haskellpa2.html for-mada por um conjunto de mdulos disponvel em tdas as implementaes de Haskell. Ela contm o 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 versoexpandida da biblioteca padro contendo alguns mdulos adicionais.

    As bibliotecas da Plataforma Haskell (http://www.haskell.org/platform/) so bibliotecas adicionaisincludas 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 definies 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(= m b) -> m a -> m bdata 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 pelaequao

    s = s0 + v0t +12

    at2

    onde s0 a posio inicial do corpo, v0 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 s0 = 100 m, a velocidade inicial v0 = 15 m/s e a acelarao da gravidade a = 9.81 m/s2 .

    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.43pi sin x2 1

    2.x2 y3

    (x y)2

    3.1

    x2 y e4x + 3

    35y

    x y

    4.24 + 4.53

    e4.4 log1012560

    8

  • 5. cos5pi6

    sin27pi8

    +tan ( pi6 ln 8)

    7 + 2

    7 Definindo variveis e funes

    Alm de poder usar as funes das bibliotecas, o programador tambm pode definir e usar suas prprias funes.Novas funes so definidas dentro de um script, um arquivo texto contendo definies (de variveis, funes, tipos,etc.).

    Por conveno, scripts Haskell normalmente tem a extenso .hs em seu nome. Isso no obrigatrio, mas til para fins de identificao.

    Variveis e funes so definidas usando equaes. No lado esquerdo de uma equao colocamos o nome davarivel ou o nome da funo seguido de seus parmetros formais. No lado direito colocamos uma expresso cujovalor 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 prefixa exemplos:myFunfun1arg_2x

    simblicos

    formados por uma sequncia de smbolos e no podem comear com dois pontos (:) so normalmente usados em notao infixa exemplos:

    ===$*=*$+=

    Ao desenvolver um script Haskell, til manter duas janelas abertas, uma executando um editor de texto paraeditar o script, e outra para o ambiente interativo (GHCi) em execuo. No Linux h vrios editores de textos quepodem ser usados, como o gedit, ou o kate. Na figura seguinte vemos o gedit.

    9

  • O editor de texto padro do Windows (Bloco de Notas) no recomendado, pois ele muito precrio para ediode programas. Um editor melhor o Notepad++ (http://notepad-plus-plus.org/).

    Os arquivos de programas em Haskell sempre devem ser salvos usando a codificao de caracteres UTF-8.

    Tarefa 4: Meu primeiro script

    Inicie um editor de texto, digite as seguintes definies 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.hsGHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for helpLoading 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 podem ser usadas:

    *Main> quadruple 1040*Main> 5*(double 2) - 317

    Observe que o GHCi usa o nome de mdulo Main se o script no define o nome do mdulo.

    Tarefa 5: Modificando o script

    Deixando o GHCi aberto, volte para o editor, adicione as seguintes definies 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 executadopara que as novas definies possam ser usadas:

    *Main> :reload[1 of 1] Compiling Main ( test.hs, interpreted )

    10

  • Ok, modules loaded: Main.

    *Main> areaCirculo 578.53981633974483

    8 Comentrios

    Comentrios so usados para fazer anotaes no programa que podem ajudar a entender o funcionamento domesmo. Os comentrios so ignorados pelo compilador.

    Um Comentrio de linha introduzido por -- e se estende at o final da linha.Um Comentrio de bloco delimitado por {- e -} . Comentrios de bloco podem ser aninhados.

    9 Regra de layout

    Em uma seqncia de definies, cada definio deve comear precisamente na mesma coluna:

    a = 10b = 20c = 30

    a = 10b = 20

    c = 30

    a = 10b = 20

    c = 30

    Se uma definio for escrita em mais de uma linha, as linhas subsequentes primeira devem comear em umacoluna mais direita da coluna que comea a sequncia de definies.

    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 + 60b = sum [10,20,30]

    A regra de layout evita a necessidade de uma sintaxe explcita para indicar o agrupamento de definies usando{, } e ;.

    -- agrupamento implcito

    a = b + cwhereb = 1c = 2

    d = a * 2

    significa

    -- agrupamento explcito

    a = b + cwhere { b = 1 ; c = 2 }

    d = a * 2

    Para evitar problemas com a regra de layout, recomendado no utilizar caracteres de tabulao paraindentao do cdigo fonte, uma vez que um nico caracterizar de tabulao pode ser apresentado na telacomo vrios espaos. O texto do programa vai aparentar estar alinhado na tela do computador, mas naverdade 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 Configuraes -> Preferncias -> Menu de Lingua-gens/Configurao de Abas -> Substituir por espao antes de editar o arquivo.

    11

  • 10 Comandos teis do GHCi

    comando abrev significado: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 carregadolet 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 Definindo funes

    Nas tarefas seguintes, quando for solicitado para definir funes, elas devem ser definidas em um script e testadasno GHCi.

    Tarefa 6

    Identifique e orrija os erros de sintaxe no script que se segue.

    N = a div length xswhere

    a = 10xs = [1,2,3,4,5]

    Tarefa 7

    Defina uma funo para calcular o quadrado do dobro do seu argumento.

    Tarefa 8

    Defina 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 doterceiro lado.

    Escreva uma funo que receba o comprimento de trs segmentos de reta e resulte em um valor lgico indicandose satisfazem esta restrio.

    Tarefa 10: Energia armazenada em uma mola

    A fora requerida para comprimir uma mola linear dada pela equao

    F = k x

    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 =12

    k x2

    onde E a energia em J (joule).Defina 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. Defina uma funo que recebao valor do salrio mnimo e a quantidade de quilowatts consumida por uma residncia, e resulta no valor a serpago com desconto de 15%.

    Tarefa 12: Receptor de rdio

    Uma verso simplificada da parte frontal de um receptor de rdio AM apresentada na figura abaixo. Essereceptor composto por um circuito que contm um resistor R, um capacitor C e um indutor L conectados emsrie. O circuito conectado a uma antena externa e aterrado conforme mostra a figura.

    Terra

    R

    +

    VR

    CL

    Antena

    +

    V0

    O circuito permite que o rdio selecione uma estao especfica dentre as que transmitem na faixa AM. Nafrequncia de resonncia do circuito, essencialmente todo o sinal V0 da antena vai at o resistor, que representa oresto do rdio. Em outras palavras, o rdio recebe seu sinal mais forte na frequncia de ressonncia. A frequnciade ressonncia do circuito indutor-capacitor dada pela equao

    f0 =1

    2pi

    LC

    onde L a indutncia em H (henry) e C a capcitncia em F (farad).Defina uma funo que receba a indutncia L e a capacitncia C, e resulta na frequncia de ressonncia desse

    aparelho de rdioTeste seu programa pelo clculo da frequncia do rdio quando L = 0,25mH e C = 0,10nF.

    13

    O ambiente interativo GHCiConstantesAplicao de funoNomeando valoresBibliotecasAvaliando expressesDefinindo variveis e funesComentriosRegra de layoutComandos teis do GHCiDefinindo funes