Académique Documents
Professionnel Documents
Culture Documents
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
HistricodaLiguagem
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
Expresses
Construtores
ChamadasdeFunes
ExpressesCondicionais
ExpressesIterativas
Acessoconstantesevariveis
Literais
Semelhantessqueestopresentesemoutraslinguagensdeprogramao.
Ex.:Lua1true3.1415d
Construtores
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
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
Todasasformasdeexpressesdaseo2.6Haskellpossui,nofoiencontradaformasexticas
deexpresses,anoseroifquepodeserrepresentadopor|,masquenoumaexpressoestranha.
Comandos
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
Properprocedure
Comandossequenciais
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
DeclaraeseEscopo
Declaraes
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
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 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
divBy_(0:_)=fail"divisionbyzeroindivBy
::
a
>
Maybe
a
Ex.2:
casedivBynumeratorxsof
Nothing>Nothing
Justresults>Just((numerator`div`denom):results)
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
Referncias
D.Watt,
ProgrammingLanguageDesignConcept
s,JohnWiley&Sons,Hoboken,2004.
H.Graham,
ProgramminginHaskell,
CambridigeUniversityPress,NewYork,2007.
Referncias