Vous êtes sur la page 1sur 14

CentrodeInformtica

UniversidadeFederaldaParaba

ParadigmasdeLinguagemdeProgramao
Professor:GustavoMotta

ParadigmaFuncional:Haskell

AmandaRenata,AndyAnand,IuryRogrio,taloAyres

Abstract
This paper has as objective to show a little bit about thehistoryof
the haskell language and analyse, discuss and display its basic
characteristics with the intention of understanding the way the
languageworks.

Resumo
Este artigo tem por objetivo mostrar um pouco sobre a histria da
linguagem haskell e analisar, discutir e mostrar suascaractersticas
bsicas com o propsito de compreenderse como a linguagem
funciona.

JooPessoa
2013

Introduo

Um computador uma mquina fsica capaz de executar instrues e fazer diversos


tratamentos sobre dados. Para informar ao computador as operaes quedeveroserexecutadas
existemaslinguagensdeprogramao.
As linguagens de programao so divididas em paradigmas de forma que linguagens
com caractersticas parecidas estejam no mesmo grupo. Entre esses paradigmas podemos cita o
lgico,orientadoaobjeto,lgico,funcional,etc.
Para se aprender uma determinada linguagem de programao necessrio que todas as
suas caractersticas sejam apresentadas ao interessado. Dessa forma o interessadodeveaprender
sobre os tipos dalinguagem,expresses,comandos,declaraes,funeseSequenciadores.Este
trabalho tem como intuito apresentar as caractersticas da linguagemHaskellqueestinclusano
paradigmafuncional.

HistricodaLiguagem

Com a difuso na dcada de 70 do conceito da conhecida por avaliao preguiosa, que


tinha como objetivo diminuir o nmero de clculos desnecessrios para a realizao de um
problema aumentando dessa forma consideravelmente o desempenho, diversas linguagens de
programaescomearamaseproliferarutilizandoesseconceito.
A linguagem Miranda lanada em 1985 foi a primeira a impulsionar a produo de
linguagens funcionais de semntica no rgida, a partir de seu lanamento outras linguagens
surgiram, como
Lazy ML, Orwell, Alfl, Id, Clean, Ponder e Daisy, contudo dois anos depois
Mirandaaindaeraamaisutilizada.
No ano de 1987 em Oregon foi realizada a
Functional Programming Languages and
ComputerArchitecture
.Nessaconfernciaouveumconsensoparaquesefossecriadoumcomit
que tivessecomoobjetivocriarumpadroabertoparaaslinguagensfuncionaisdesemnticano
rgida, dessa forma as linguagens existentes seriam consolidadas e serviriam como base para
futuraspesquisasedesenvolvimentodenovaslinguagens.
A primeira reunio do comit aconteceu em janeiro de 1988 onde algumas metas para a
construo do padro e de uma linguagem que utilizasse esse padro foram definidas, a
linguagem deveria serdefcilensino,deveriaserdescritacompletamenteapartirdeumasintaxe
e semntica formal e deveria est disponvel livremente. A futura linguagem foi nomeada de
HaskelemhomenagemaolgicoHaskellCury.
A primeira verso de Haskell foi definida emabrilde1990comfuturasverseslanadas
em agosto de 1991, sendo conhecida como Haskel 1.1, Maro de 1992 (Haskell 1.2), Maio de

1996(Haskell1.3)eAbrilde1997(Haskell1.4).
Em janeiro de 1999 foi lanada o padro mais utilizado e expandido da linguagem o
padro 98.OHaskell98ficouconhecidoporsuaversomnima,estveleportveldalinguagem
eporcontertambmabibliotecadeensino,sendorevisadosomenteem2003.
O Haskell, principalmente o padro 98, continua sendo utilizado de forma ampla dentro
da programao de problemas em geral. Levando a linguagem a continuar em constante
evoluo, sendo que em 2006 um processo foi iniciado para definir um sucesso ao padro 98,
informalmenteconhecidocomoHaskellPrime.

TIPOS

AlinguagemHaskellsuportaostiposprimitivosbool,char,string,int,integer,float.Abaixo
estadescriomaisdetalhadadecadaumdeles:

Bool
:tipoquepossuidoisvaloreslgicos,falseortrue
Char
:Contmcaracteresnormaiscomoaealgunscomefeitosespecias,comoo\n(mover
paraaprximalinha)eo\t(passarparaaprximaparadadetabulao).Comopadro,oscaracteres
individuaisdevemsercolocadosemaspanica.
String
:Sequnciadecaracteres,porexemplo,abceastringvazia.Utilizaseaspas
duplaspararepresentaodecadeiasdecaracteres.

Int
:umvalorinteirolimitadoacertaquantidadedememria.Esselimitede2a21

Integer
:Sediferedointpelofatodelerepresentarumnmerointeiro,massemlimitede
memriaparasuarepresentao.

Float
:Representaosnmeroscomcasasdecimais,como1.5ou2.2.

Ostiposcompostosdalinguagemso:

Tipodelista

Umalistaumasequnciadeelementosdomesmotipo,comoselementosentre
colcheteseseparadosporvrgula.
Exemplo:[False,True,False]::[Bool]
Lse:False,True,False]pertencemaotipobooleano.

Onmerodeelementosdeumalistadenominadocomprimentodalista.Alista[]tem
comprimentozeroechamadadelistavazia,enquantoalista[Falso]denominadalistanica.bom

observarque[[]]e[]solistasdiferentes,poisaprimeirarepresentaumalistavaziacomumnico
elementoeaoutrasimplesmenteumalistavazia.

Tipodetupla

Umatupladefinidacomoumasequnciafinitadecomponentesdediferentestipos.
Exemplo:(False,True,a)::(Bool,Bool,Char)

Onmerodeelementosdeumatuplachamadodearidade.Atupla()temaridade0e
chamadadetuplavazia,jastuplasdearidadedoissochamadasdepares,astuplasdearidadetrsso
chamadasdetriplos,eassimpordiante.Astuplasdearidadeumcomo,(False)nosopermitidaspor
entrarememconflitocomousodeparntesesparafazerordemdeavaliaoexplcita,porexemplo,
(1+2)*3.

EmHaskellaindapossveldefinirumtipodenominadotiporecursivo.Eledependeda
necessidadedoprogramadorepodeserusadoemvrioscontextos.Umcontextoquepermiteumbom
usodetiposrecursivospararvoresbinrias,jqueasmesmassoestruturadasusandonaturalmente
arecurso.Almdisso,possuitipagemestticapermitindoinfernciadetipos,ouseja,ocompilador
associaimplicitamenteotipodavarivelconformeovalordela.Emoutraspalavras,ostiposdedados
soestticosesoverificadosemtempodecompilao.

Equivalnciadetipos

O sinal aritmtico de + calcula a soma de quaisquer dois nmeros de mesmo tipo


numrico. Ele pode ser usado para calcular a soma de dois inteiros,ouasoma dedoisnmeros
depontoflutuante.Exemplo:1+2=3ou1.1+2.2=3.3.
A ideia de que a pode ser aplicada a qualquer nmero de tipo numrico feita noseu
tipo, atravs da incluso de classe de restrio. AsclassesrestritassoescritasnaformaC,onde
Conomedaclasseeaonomedavarivel.
Exemplo: (+) :: Num a aaa,isto,paraqualquertipoafuno(+)temumtipo
a a a. Um tipo que contem uma ou mais restries denominado sobrecarregado ou
overloaded. Alm disso, os prprios nmeros tambm podem ser sobrecarregados. Por
exemplo,3::Numaumsignificaqueparaqualquertiponumricoa,onmero3temtipoa.

Expresses

A linguagem de programao Haskell apresenta todas as formas deexpressespresentesna


seo2.6dolivrotextoadotadonadisciplinaParadigmasdeLinguagemdeProgramaoesoelas:
Literais

Construtores
ChamadasdeFunes
ExpressesCondicionais
ExpressesIterativas
Acessoconstantesevariveis

Literais

Semelhantessqueestopresentesemoutraslinguagensdeprogramao.

Ex.:Lua1true3.1415d

Construtores

Haskellpossuiexpressesqueconstroem um valor compostoatravsde valores maissimples.


ConstrutoresdeTuplaseListassoexemplosdestasexpresses.

Ex1.:Construindoumatupla

Prelude>(1,True)

(1,True)

Prelude>((3,f),('e',0.0001))::((Integer,Char),(Char,Float))

((3,f),('e',1.0e4))

Prelude>typePonto=(Int,Int)

Prelude>typeCirculo=(Ponto,Float)

Ex2.:ConstruindoListas

Prelude>[1,2,3]

[1,2,3]

Prelude>[1..5]

[1,2,3,4,5]

Prelude>[1,3..10]


[1,3,5,7,9]

Prelude>'P':['A','R',A,D,I,g,m,a,s]

PARADIgmas

ChamadasdeFunes

As chamadas de funes em Haskell tomam a forma f x onde f uma funo que ser
aplicadasobre oargumentoxpara computarum resultado.interessantequeemHaskell,funesso
valores de primeira classe, o que significa que f pode resultar em uma funo, como mostrado a
seguir:

(ifthensinelsecos)(x)

seacondioforatendida,aexpressoesquerdaresultanafunosin,senonacos.

Maisexemplos:

Prelude>truncate18.32

18

Prelude>round10.59

11

Prelude>succ6

ExpressesCondicionais

Possuem aformaife1thene2else e3. Podemser vistascomoumafunodetipoBool >a


>a>a.

Ex.:ifc>='a'&&c<='z'
then"Aletraminscula"
elseifc>='A'&&c<='Z'
then"Aletramaiscula"
else"NoumaletranoalfabetoASCII!!"


Haskell tambmpossui aschamadascasesexpressions. Em umacaseexpressiondeve possuir
no mnimo uma alternativa e cada alternativa deve ter um corpo. Cada corpo deveter omesmo tipo,
tipoqualdeveseromesmodaexpressoavaliada.

Ex.: aaax=casexof
1>"A"
2>"B"
3>"C"
_>D

Nachamadaaaa3,asadaseriaC.Opattern_semelhanteaodefaultemCeJava.

ExpressesIterativas

Esto presentes na linguagem atravs das lists comprehensions. Como lecionado durante o
curso, umaexpresso como essa computasobreuma sriedevalores paraproduzirumresultado.List
comprehensions so derivadas do conceito de compreenso de conjuntos na matemtica, como a
seguintedefinio:

{x|x
Zx<5}

Estamosretirandoumconjuntodeoutroconjunto,estaexpressoresultarianaobtenodo
conjuntodetodososnmerosinteirosmenoresque5apartirdoconjuntodetodososnmerosinteiros.

PodemosvercomoalinguagemHaskellpossiblitaousodessasexpresses:

Ex.:[y|y<ys,ymod2=0]

Dado que ys uma lista com vrios nmeros naturais, o resultado dessa expresso seria
umanovalistacomtodososnmerosparesencontrados.

Acessoavariveiseconstantes

Variveis so tecnicamenteconstantesem Haskellelas notemseus valoresvariados.Portanto


o acessoa umavarivelnomeadapiser3.1415diretamente,oquedeixaafaltaroacessoavarivel,j
queumavarivelnopodemudardevalor.

Todasasformasdeexpressesdaseo2.6Haskellpossui,nofoiencontradaformasexticas
deexpresses,anoseroifquepodeserrepresentadopor|,masquenoumaexpressoestranha.

Comandos

Um comando uma construo do programa que ser executada a fim de atribuir ou


alterar o estado do programa. Alguns comandos so primitivosdalinguagemcomoporexemplo
skip, atribuies e chamadas de procedimento, j outros so criadosapartirdeoutroscomandos
simplescomocomandossequenciais,condicionaiseinterativos.

Skip

Haskell no possui um comando para skip por isso a edenteno no programa muito
importante para manter a legibilidade e o entendimento do fluxo que o programa estseguindo,
portanto quando necessrio ser interessante comentar o cdigo para mostrar o fim de uma
atividade.
moduleMainwhere
main::IO()
main=putStrLnHelloWorld!

Atribuio

Em haskell a atribuio indicada pelo operador = que por coincidncia o mesmo


operadordeatribuiodalinguagemC.Deveseficaratentocomooperadordecomparao==
paranoconfundirosdois.
typeString=[Char]

Properprocedure

Um proper procedure definido como uma funoderetornodotipovoid,comohaskell


nopossuiotipovoidpodemosafirmarqueemhaskellnoexisteocomandoproperprocedure.

Comandossequenciais

Haskell uma linguagem imperativa, nesse tipo de linguagem muitocomumexistirem


comandos sequenciais portanto haskell tambm tm. importante lembrar que em haskell uma
varivel s vista pelo programa depois que foideclaradaportantooprogramadordevelembrar
queavariveljdevetersidocriadaparaserutilizadanoprograma.

Comandoscondicionais

Haskell possui comandos condicionais, esses comandos analisam uma expresso logica
para determinar qual dos dois blocos ser executado. interessante avisar que diferentes de
outras linguagens no haskell ao definir um if o programador obrigado a colocar um else
associado.
main=doputStrLnQuanto5+4?
x<readLn
ifx==9
thenputStrLnVocacertou!
elseputStrLnVocerrou!

Comandositerativos

Haskell no possui comandos iterativos, contudo possui recursividade o que j


suficienteparasimularaiteratividadeinexistente.

DeclaraeseEscopo

Declaraes

Em Haskell, os blocos apresentam uma estutura aninhada, ou nested, onde o programa


divididoemdeclaraesecomandosorganizadosemprocedimentosestruturadosnoescapsulados.
Asestruturasdevemserdeclaradasantesdequalquervariaveldaqueletipo,mesmoqueesta
sejaStatic(Ex.:TypeIdade=Int),issoacontecemesmonostiposprimitivos,massendoinferidopelo
compilador(Ex.:chr::Int>Char).

Haskellcostumafazerdeduodetiposnadeclaraodevariveis,queso,emgeral,
constantesduranteaexecuo,comalteraesemrelaoaottulodereferncia.

Ex:cabealho::String

cabealho=AlunoNota\n

VistoqueHaskelltrabalhacomdeduo,detiposecomandos,adeclaraodeprocedimentos
trivial,nosendonecessriodeclaraodetiposourotulosnosparametrosquandosechamaafuno,
(algovistocomumenteemlinguagensinterpretadasdescript).

Ex.:factorialn=ifn==0then1elsen*factorial(n1)

DeclaraescolateraissodesnecessriasemHaskell,vistoqueomesmoatuanadeduode
tipos.

Bindables

ParadeclaraodeumasequenciadeoperaesnoHaskell,temosos
Monads,
declarados

da
seguinteforma:
Ex.:imprimeAlunos::Int>String
imprimeAlunos1=imprimeAluno1
imprimeAlunosn=imprimeAlunos(n1)++imprimeAlunon

Vsequeasdeclaraessequenciaispodemserfeitasdemodoausaroquejfoidefinido
anteriormente.Assimcomoestadosdenodeterminismoeexceespodemserrepresentadosassim:
Ex.:
return::a>Maybea
(>>=)::Maybea>(a>Maybeb)>Maybeb

Haskellpossuisuporteparafunesrecursivas,assimcomoprocedimentosdeentradaesada,
comoputStrLn,putStr,print.

Escopo

Conformejfoidito,Haskellusaumsistemadeescopolxico,ouesttico,e
nested,
ou
aninhado,mascomalgumasdiferenascomoapossibilidadedeutilizaodevariveisqueaindasero
definidas,desdequedentrodoescopodobloco.

Ex:
par=0:map(+1)impar
impar=0:map(+1)par

Paradefiniodevariaveiseprocedimentosquesserousadaslocalmenteporumafuno,
usaseo
where
.

Ex:
whereimc=massa/altura^2

(abaixodopeso,normal,sobrepeso)=(18.5,25.0,30.0)

Norecomendadoadeclaraodeclassesvisiveisglobalmente,poisissopermitiriafalhasno
polimorfismo,possivelmentegerandoinstanciasorfs,quenotemtipodedadodefinido,nemclasse.
Paranogeraressetipodeimprevisto,aplicadoencapsulamentonostiposclasse.

Funes

Matemtica

Haskell

f
(x)

f
x

f
(x,y)

f
xy

f
(g(x))

f
(gx)

f
(x,g(y))

f
x(gy)

f
(x)g(y)

f
x*gy

Em Haskell funo definida como um mapeamento que leva um ou mais argumentos


produzindo assim um resultado. Exemplo: a funo double pega um nmero x como seu
argumento e produz o resultado x+x ( double x = x+x). Quando a funo aplicada aos
argumentos atuais, o resultado obtido atravs da substituio destes argumentos dentro do
corpodafuno,produzindoassimumresultado.
Haskell uma linguagem funcional de ordem superior ou de alta ordem, o que significa
que as funes podem livremente assumir funes como argumentos e funes como resultado.
O uso funes de ordem superior permite que os padres de programao comuns, composio
de funes, que sero definidas como funes dentro da prpria linguagem. Mais em geral, as
funes de ordem superior podem ser utilizadas paradefinirodomnioespecficodalinguagem,
comoparaoprocessamentodelista,programaointerativa.
Os programas em Haskell so executados usando uma tcnica chamada avaliao
preguiosa ou lazy evaluation, que se baseia na ideiadeque nenhumclculodeveserrealizado
at que seu resultado seja muito necessrio. Alm de evitar a computao desnecessria, a
avaliao preguiosa garante que os programas terminem sempre que possvel, incentiva
programarnumestilomodularusandoestruturasdedados.

Currying

Currying um processo que que transforma uma funo que tm multiplos argumentos
em uma funo de argumentos simples e retorna uma outra funocasoalgumargumentoainda
necessrio.
f :: a -> b -> c
f :: (a, b) -> c
Em haskell todas as funes esto na forma de argumentos simples, ou seja em cada
funoocorreoprocessode
currying
,porexemplosepegarmosaseguintefuno:

div :: int -> int -> int.

div 11 2
O retorno desta funo gera oresultado5,contudonoaconteceadivisoimediatade11
por 2, primeiro acontece a avaliao da expresso div 11 para verificar ser ela uma expresso
do tipo int -> int
, aps isso feita a diviso por 2. Desta forma a funonaverdadeexecut
a div
(int, int) -> int.

Sequenciadores

Diferente das linguagens de outras linguagens de programao (imperativas), Haskell abstrai ao


mximo a preocupao do programador com sequenciamento. Oprogramadorsprecisa sabero que
ser computado e nocomo equando ser.Porm,existeapresenade sequenciadoresem Haskelle
eles so teis para a preveno de erros, de excees que podem quebrar o programa.Um exemplo
dissoaexpresso
fail
:

divBy_(0:_)=fail"divisionbyzeroindivBy

Outros tipos de sequenciadores so os Monads, entreeles podemoscitar oMaybe querelata queum


resultadopodesaircomonoesperado,o Justpararelatarumresultadoesperadoeonothingparauma
possvelexceo.
Ex.1
:
return

::
a
>

Maybe
a
Ex.2:
casedivBynumeratorxsof
Nothing>Nothing
Justresults>Just((numerator`div`denom):results)

Existe tambmo usodoeither quepodeserutilizadoparaindicar umresultadocertorighteumerrado


left.
Ex.:divBy::Integrala=>a>[a]>EitherString[a]

divBy_[]=Right[]

divBy_(0:_)=Left"divBy:divisionby0

Ex.2:

trya=catch(Right`liftM`a)(return.Left)
Percebemos apresenadotry/catchnoHaskellassociada comouso do Righte Left, queservecomo
resultadodessesequenciador.

O return tambmestpresentenestalinguagemetemfuncionamentosemelhantesoutraslinguagens

deprogramao,comoescapedeumafuno.
Ex.:return((numerator`div`denom):next)

Concluso

Para se programar bem em um determinada linguagem de programao necessrioque


o programador tenha em mente todas as caractersticas importantes daquela linguagem e que
tenhadomniosobreoquepodeeoquenopodeserfeitoporela.
Devese sempre lembrar que qualquer linguagem de programao capaz de resolver
qualquerproblemacomputveljqueesseumdosrequisitosparaidentificarumalinguagemde
programao, contudo cada linguagem tem suas particulariedades e isso faz com que existam
linguagens mais simples para se resolver o problema ou que executem o programa mais
rapidamente e decidir qual a melhor linguagem para seu problema um ponto importante que
cadaprogramadordevesaber.

Referncias

D.Watt,
ProgrammingLanguageDesignConcept
s,JohnWiley&Sons,Hoboken,2004.

H.Graham,
ProgramminginHaskell,
CambridigeUniversityPress,NewYork,2007.

Referncias

Vous aimerez peut-être aussi