INTRODUO
Caractersticas Gerais:
Linguagem Puramente Funcional Possui um compilador e um interpretador Tem como idia principal a avaliao de expresses
Compilador/Interpretador:
Uma particularidade da linguagem a presena de um compilador e um interpretador. Ambos utilizam-se de um editor externo, sendo que o primeiro gera um executvel para a plataforma utilizada e o segundo realiza o trabalho de interpretao do cdigo inserido.
Compilador/Interpretador:
Exemplos:
Prelude> 7+3 10
Valores e Tipos
Tipos Primitivos:
Tipos Compostos:
Produtos Cartesianos:
Em haskell temos a tupla como uma agregao de um ou mais componentes, que podem ser de tipos diferentes:
--- Script com tupla (Os dois traos --" indica comentrio -Type Nome = String -- Sinnimo para String(nome) Type Idade = Int -- Sinnimo para Int(idade) saberIdade :: (Nome,Idade) -> Idade -- Funo que passa a tupla saberIdade :: (a,b) -> b -- e devolve(retorna) a idade
Tipos Compostos
Mapeamento:
Em Haskell existem as funes que funcionam como mapeamento. A operao mais importante das funes a sua aplicao: As funes vo estar subjacentes a todas as manipulaes da linguagem e implementam a exponenciao de conjuntos. Ou seja o conjunto de todas as funes de A para B dado por B A .
Tipos Compostos:
Conjuntos Potncia:
Haskell no possui Conjuntos Potncia
Tipos Recursivos:
Grande parte das definies em Haskell sero recursivas, principalmente as que precisam de algum tipo de repetio.
Partindo da idia que: (Exemplo do Fatorial) . O fatorial de 0 sempre ser 1; . O fatorial de um numero n > 0, ser 1*2*...*(n-1)*n
fatorial :: Int -> Int int fatorial 0 = 1 fatorial n = n*fatorial(n-1) -- Declarao da funo recebendo int e retorna
Strings
Podem sempre ser consideradas como uma lista de elementos do tipo char. Se for digitado uma string entre aspas, no interpretador o retorno ser ela mesma, pois ela j est em sua forma normal. Ex:(Famoso Al Mundo)
Prelude > Alo Mundo Alo Mundo Prelude > reverse Alo Mundo odnuM olA <- Alo mundo comando do usuario <- retorno do sistema <- Aplicando a funo reverse <- retorno do sitema
Sistema de Tipos:
O Haskell uma linguagem de programao com uma disciplina de tipos rigorosa Haskell tem um, e um s, tipo, sendo sempre possvel determinar o tipo de uma determinada entidade Haskell estaticamente tipada
Variveis e Comandos
Variveis:
Haskell no possui:
Variveis Compostas Atualizao Seletiva
As variveis Heap em Haskell existe de forma implcita nos compiladores e/ou interpretadores:
Arquivos:
Arquivos:
Exemplo:
main = do putStr(Escreva uma linha e tecle ENTER:) linha <- getLinha nome <- criaArq linha putStr( A linha \n ++linha ++ \nesta no arquivo ++ nome++ !) criaArq :: String -> IO String criaArq linha :: do putStr(Nome do arquivo a ser criado) nome <- getLine writeFile nome linha return(nome)
Arquivos:
A funo principal pega uma linha e usa como parmetro para a funo criaArq. Esta solicita o nome do arquivo a ser criado e o cria com a funo, writeFile, ento devolve o nome do arquivo com a funo
Comandos
Por ser uma linguagem funcional Haskell enfatiza a avaliao de expresses ao invs da execuo de comandos.
Comandos Interativos:
Haskell apresenta interaes, usando recurso, podendo assim trabalhar com entrada de dados ilimitada. Ilustrando esse conceito podemos demonstrar um exemplo de funo que l vrios nomes e os exibe em ordem alfabtica:
Comandos Interativos:
main = do nomes <- lerNomes putStr (unlines (sort nomes)) lerNomes do putStr(Escreva um nome:) nome <- getLine if nome == then return [] else do nomes <- lerNomes return ([nome] ++ nomes) sort[] = [] sort(a:b) = sort[x|x<-b,x < a] ++[a]++ sort(a:b) = sort[x|x<-b,x >= a]
Comandos Interativos:
A funo lerNomes chamada recursivamente , at que encontre uma String vazia. Sendo o controle feito por (if then else), que tem comportamento igual ao de outras linguagens de programao. lerNomes retorna uma lista de strings, que passada depois pela funo sort(ordenao). O resultado exibido depois de passar por essa funo.
Comandos Seqenciais:
Os comandos so executados de maneira obvia, em seqncia. Um exemplo pode ser o programa de calculo do fatorial:
fatorial :: Int -> Int int e retorna int fatorial 0 = 1 fatorial n = n*fatorial(n-1)
4. Associaes e Escopo
4.1 Associaes: Feitas atravs das prprias funoes; Identificadores: tm que comear com com uma letra maiscula ou minscula seguida por sequencia opcional de letras, dgitos, sublinhas ou apstrofes. Particularidades: - Definies de valores ou funes ou variveis tm que comear com letra minscula; -Tipos, construtores, mdulos e classes de tipos tm que comear com letras maisculas;
4. Associaes e Escopo
4.1.1. Ambientes: Haskell permite que um mesmo identificador seja declarado em diferentes partes do programa, possivelmente representando diferentes entidades
4. Associaes e Escopo
4.1.2. Escopo e Blocos Como em qualquer outra linguagem, em Haskell cada declarao possui um escopo que o trecho de programa no qual a declarao efetiva; Como em qualquer outra linguagem, em Haskell um bloco um grupo de construes de programa que delimita o escopo das declaraes nele contidas.
4. Associaes e Escopo
4.1.2.1. Estrutura de blocos Haskell apresenta uma estrutura plana; Haskell apresenta associao esttica (o corpo do bloco avaliado no ambiente em que foi definido tempo de compilao)
5. Declaraes
5.1. Definio: Onde produz-se associaes fact1 :: Int -> Int fact1 n
5. Declaraes
5.2. Declarao de Tipo Associa um identificador a um tipo myNot :: Bool -> Bool yNot True = False yNot False = True
5. Declaraes
5. Declaraes
5.5. Declarao sequencial: Como em qualquer outra linguagem que dar suporte a este tipo de declarao, deve ser escrita da forma D1;D2, onde D1 seguida de D2 e as associaes produzidas em D1 podem ser usadas em D2. fatorial :: Integer -> Integer fatorial 0 = 1 fatorial n = n *fatorial(n-1)
5. Declaraes
5.6. Declarao recursiva: Uma declarao recursiva usa das prprias declaraes que ela produz. Um exemplo em Haskell, o exemplo acima citado, com o uso da declarao fatorial.
6. Abstraes
6.1.1. Abstraes de Funes A abstrao de funo contm uma expresso a ser avaliada que, quando chamada, resultar em um valor. Uma funo tem uma assinatura: uma especificao declarando os tipos de argumentos e resultado. increment :: Int -> Int increment x = x + 1
and1 :: Bool -> Bool -> Bool and1 a b = if a == b then a else False
6. Abstraes
6.1.2. Abstraes de procedimentos Uma abstrao de procedimento contm um comando a ser executado que, quando chamado, ser executado, atualizando as variveis. O usurio de uma abstrao de procedimento observa apenas o seu efeito (alterao de variveis), mas ignora que passos internos so executados
6. Abstraes
6.1.3. Princpio das Abstraes possvel construir abstraes sobre qualquer construo sinttica da linguagem Haskell, desde que algum tipo especfico de computao seja especificado. 6.2 Parmetros So usados para permitir que uma abstrao receba valores especficos para realizar sua computao, um argumento um valor passado para uma abstrao, e o identificador usado para denotar um argumento dentro de uma abstrao chamado parmetro formal. J nas expresses que retorna um argumento na chamada de uma abstrao chamado parmetro real.
6. Abstraes
6.2.1. Passagem de parmetro por cpia As formas de passagem dos parmetros, que a associao entre parmetro reais e formais podem ser: por valor (copiado para a abstrao); por resultado (copiado da abstrao); e, por valor/resultado (copiado para/da abstrao). Por valor o parmetro que uma varivel local, criada e inicializada com o valor do argumento e as alteraes neste parmetro no geram efeitos em variveis globais. Por resultado o argumento deve ter acesso a varivel, sendo que no inicio o parmetro formal criado e no final os valores do parmetro so atribudos a varivel recebida como argumento. Por valor/resultado a combinao de por valor e por resultado.
6. Abstraes
6.2.3. Princpio da correspondncia Para cada forma de declarao deve ser provido um mecanismo de passagem de parmetro correspondente.
7. Encapsulamento
Mdulos Para escrever mdulos em Haskell, basta adiciona linha a palavra-reservada module, o nome do mdulo, seguido pela palavra-reservada where. Esta linha deve ser a primeira linha no script escrito em Haskell que no est comentada ou vazia. Um exemplo: -- filename: Test.hs -- project : Haskell Script -- author : Thiago Gondim -- date : 29 Setembro 2006 module Test where data Person = Pers String Int -- etc. -- fim do arquivo Algumas convenes so teis: -- Colocar exatamente 1 (hum) mdulo em um nico arquivo -- Nomear arquivos e mdulos com mesmo nome.
7. Encapsulamento
7.1. Pacotes Em Haskell, um pacote pode ser um procedimento, funo ou um grupo de componentes declarados ( constantes, variveis, etc ) com o propsito comum.
7. Encapsulamento
Tipo Abstrato de Dados data PersonInfo = Person String Int greeting :: PersonInfo -> String greeting (Person nome idade) | idade < 12 = "Seus pais sabem onde voc est, " ++ nome ++ "?" | idade > 80 = "Seus filhos sabem onde voc est, " ++ nome ++ "?" | otherwise = "Al, " ++ nome ++ "!"
7. Encapsulamento
7.3. Classes Quando fala-se de classes em Haskell, falase em classificar tipos de dados, de acordo com quais funes pode-se usar nelas. class Greetable a where greeting :: a -> String greetings :: [a] -> [String] greet :: a -> IO ()
7. Encapsulamento
7.3. Instncias Um tipo de dado admitido por uma classe pelos significados de uma declarao de instncia. Isto , onde define-se as funes requeridas pela classe. Para admitir um tipo de dado PersonInfo em uma classe Greetable, temos: instance Greetable PersonInfo where greeting (Person nome idade) | idade < 12 = "Seus pais sabem onde voc est, " ++ nome ++ "?" | idade > 80 = "Seus filhos sabem onde voc est, " ++ nome ++ "?" | otherwise = "Al, " ++ nome ++ "!"
Sobrecarga
Sobrecarga
Outro exemplo:
Main> 1.4 +1 2.4 Main> 1+1 2 Main> 1.666 + 1.2 2.866 Hugs> "italo" ++ " a "italo a"
Sobrecarga
Veja o exemplo:
incrementa :: Int -> Int incrementa x=x+1 incrementa :: String -> String incrementa "x"= "x" +"italo"
Polimorfismo
Coero
Apresenta-se em Haskell.
Main> sqrt 4 (coero implcita) 2.0 Main> decrementa 4.3 ERROR - Cannot infer instance *** Instance : Fractional Int *** Expression : diminui 4.3 Main> decrementa (round 4.3) 3 O cdigo: decrementa :: Int -> Int decrementa x= x-1 (coero explcita)
Subtipos e Herana
Herana em Haskell.
class (Eq a) => Ord a where (<), (<=), (>=), (>) :: a -> a -> Bool max, min :: a -> a -> a
Tambm existe herana mltipla: Class (Eq t, Show t) => Minhaclasse t where ...
Monomorfismo
Como vimos anteriormente Haskell tem recurso de polimorfismo, vamos ver como se apresenta o monomorfismo:
Main> decrementa 3.5 ERROR - Cannot infer instance *** Instance : Fractional Int *** Expression : decrementa 3.5
O cdigo:
decrementa :: Int -> Int decrementa x= x-1
Seqenciadores
1. 2. 3. 4.
Comandos Seqenciais: Do tipo c1:c2. mini :: Int -> Int -> Int mini a b | a <= b = a | otherwise = b quadrado :: Int -> Int quadrado x = x * x
5. 6.
Main> mini (quadrado 2) 5 4 Executa-se as linhas 5 e 6, retornando o valor 4, e depois as linhas de 1 a 4, retornando o valor 4. Onde c1 corresponde a (quadrado 2) e c2 a (mini (quadrado 2) 5).
Seqenciadores
Condicional.
Bastante usado em Haskell. Comandos do tipo if exp then c1 else c2.
1. 2. 3. 4.
Main> mini 1
Seqenciadores
Comandos Interativos.
Haskell no possui este recurso.
1. 2. 3.
Seqenciadores
Desvios Incondicionais.
1.
Desvio Incondicionais Um desvio incondicional uma transferncia explicita de controle de um ponto para outro ponto do programa. Haskell no possui este recurso.
2.
Escape Termina a execuo de um comando composto, transferindo o controle da execuo para o comando seguinte. Haskell tambm no possui este recurso
Excees
Protegendo a funo f:
Excees
catch :: minha_excessao a (Exception -> minha_excessao a) -> minha_excessao -> a raise :: Exception - > a throw :: Exception - > IO ->a
Concorrncia
p par e. Indica que paralelismo entre as expresses p , e. p seq e. Indica seqencialidade entre as expresses p, e.
pfib n | n <= 1 = 1 | otherwise = n1 par n2 seq n1+n2+1 where n1 = pfib (n-1) n2 = pfib (n-2)