Você está na página 1de 7

Comeando ndice SintaxeemFunes

TiposeTypeclasses
Acreditenotipo
JfalamosqueHaskellpossuiumsistemadetiposesttico.Otipodetodaexpresso
conhecidonahoradacompilao,oqueresultanumcdigomaisseguro.Sevocescrever
umprogramaquetentedividirumtipobooleanoporumnmero,elenemcompilar.Isso
bomporquemelhordetectarmoserroslogoaoterminardeprogramardoquesedeparar
comtravamentosindesejados.TudoemHaskelltemumtipo,entoocompiladorpode
considerarvriaspossibilidadesantesmesmodecompillo.

AocontrriodeJavaouPascal,Haskellteminfernciadetipo.Sefordigitadoumnmero,noprecisamosavisarao
Haskellqueumnmero.Eleconsegueidentificarissoautomaticamente,nodamosostiposdefuneseexpresses
explicitamente.NsveremosapenasobsicodeHaskellcomumavisoapenassuperficialsobretipos.Noentanto,
entenderosistemadetiposmuitoimportanteparaoaprendizadodeHaskell.

Um"tipo"algocomoumaetiquetaquetodaexpressotm,quenosdizemqualcategoriaelaseencaixa.Aexpresso
Truebooleana,"hello"umastring,etc.

AgorausaremosoGHCIparadescobrirostiposdealgumasexpresses.Faremosissousandoocomando:tque,
seguidodequalquerexpressovlida,retornaoseutipo.Vamosdarumaolhada.

ghci>:t'a'
'a'::Char
ghci>:tTrue
True::Bool
ghci>:t"HELLO!"
"HELLO!"::[Char]
ghci>:t(True,'a')
(True,'a')::(Bool,Char)
ghci>:t4==5
4==5::Bool

Fazendoisso,vemosque:tmostraaexpressoseguidade::eseutipo.::podeserlido
como"dotipo".Tiposexplcitossempresoreferidospelasuaprimeiraletramaiscula.'a',
comovisto,dotipoChar.Nodifcildeidentificarquevemdapalavracaracter.True
Boolean.Fazsentido.Mas,oqueisso?Examinandootipode"HELLO!"descobrimosque
ele[Char].Oscolchetesdenotamumalista.Entolemosissocomoumalistade
caracteres.Aocontrriodelistas,cadavalordatuplatemseutipo.Entoaexpresso
(True,'a')temotipo(Bool,Char),eumaexpressocomo('a','b','c')dever
retornar(Char,Char,Char).4==5sempreretornarFalse,quedotipoBool.

Funestambmtmtipos.Quandoescrevemosnossasprpriasfunes,podemosdeclararexplicitamentequaissoos
seustipos.Issogeralmenteconsideradoumaboaprticaexcetoquandoafunomuitocurta.Daquiprafrente
daremosvriosexemplosquefazemusodedeclaraodetipos.Vocaindaselembradaquelacompreensodelistaque
criamosnocaptuloanteriorequeusavafiltrospararetornarsomenteapartemaisculadeumastring?Ento,aquiesta
elanovamentecomostiposdeclarados.

removeNonUppercase::[Char]>[Char]
removeNonUppercasest=[c|c<st,c`elem`['A'..'Z']]

removeNonUppercasetemotipo[Char]>[Char],oquesignificaqueelepartedeumastringechegaemoutrastring.
Ouseja,eleirrecebercomoparmetroumastringenosdevolveroutrastringcomoresultado.Otipo[Char]sinnimo
deStringentoficariamaisclarosefosseescritoremoveNonUppercase::String>String.Noprecisariamos
fazeressadeclaraodetipoparaocompiladorporqueelepoderiainferirporsisqueessafunorecebeumastringe
retornaoutrastring.Esensprecisarmosdeumafunoquerecebevriostiposcomoparmetro?Vamosverentouma
funobemsimplesquepegatrsinteiroseossoma:

addThree::Int>Int>Int>Int
addThreexyz=x+y+z

Osparmetrossoseparadospor>enohnenhumadistinoentretiposdeparmetroseretorno.Otipodoretorno
oltimoeosparmetrossoostrsprimeiros.Maisadianteveremosoporqudelesseremapenasseparadosporum>
aoinvsdeterumdestaquemaiorcomoInt,Int,Int>Intoualgodognero.

Sevocdesejaespecificarotipodafuno,masnotemcertezadequaldeveser,vocpodeescrevlanormalmentee
depoisdescobrircomo:t.Funestambmsoexpresses,ento:tfuncionasemproblemas.

Aquitemosumapanhadogeraldosprincipaistipos.

Int inteiro.usadopornmerosinteiros.7podeserumIntmas7.2no.Intpossuilimitaesdetamanho,oque
significaterummximoeummnimo.Geralmenteoscomputadoresde32bittmumIntmximode2147483647eum
mnimode2147483648.

Integer significa,hmmm...inteirotambm.Aprincipaldiferenaquenotemlimitaesepodeserusadopornmeros
realmentegrandes.Digo,extremamentegrandes.Contudo,Intmaiseficiente.

factorial::Integer>Integer
factorialn=product[1..n]

ghci>factorial50
30414093201713378043612608166064768844377641568960512000000000000

Float umnmerorealempontoflutuantedeprecisosimples.

circumference::Float>Float
circumferencer=2*pi*r

ghci>circumference4.0
25.132742
Double umnmerorealempontoflutuantecomodobro(!)depreciso.

circumference'::Double>Double
circumference'r=2*pi*r

ghci>circumference'4.0
25.132741228718345

Bool umtipobooleano.Podeterapenasdoisvalores:TrueouFalse.

Char representaumcaractere.delimitadoporaspassimples.UmalistadecaracteresdenominadaString.

Tuplassotiposmaspossuemumavariaodeacordocomaquantidadeevaloresquecontm,entoteoricamente
temostuplascominfinitostipos,oquedemaisparacobrirnessetutorial.Notequeumatuplavazia () tambmumtipo
epodeassumirapenasumvalor:()

Tipovarivel
Qualvocachaqueotipodafunohead?Jqueheadrecebeumalistaeretornaoseuprimeiroelemento,qualdeve
seroseutipo?Vamosdescobrir!

ghci>:thead
head::[a]>a

Hmmm!Oqueessea?otipo?Lembresequejvimosqueotipoescritocomaprimeiraletra
maiscula,entonopodeserexatamenteotipo.Eexatamenteessadiferenaquenosdizser
umtipovarivel.Issosignificaqueoapodeserqualquertipo.Issoalgocomoosgenricosde
outraslinguagens,masemHaskellmuitomaispoderosoporquenospermitefacilmenteescrever
funesmaisgenricascasooprocessamentosejaomesmoparadiferentestipos.Funesque
possuemtiposvariveissodenominadasfunespolimrficas.Adeclaraodetipoemheaddizqueelerecebeuma
listadeelementosdequalquertipoeretornaumelementodela.

Emboratiposvariveispossamternomescommaisdeumcaractere,normalmentensdamosaelesnomescomoa,b,c,
d...

Selembradafunofst?Aquelaqueretornaoprimeirocomponentedeumpar?Ento,vamosexaminaroseutipo:

ghci>:tfst
fst::(a,b)>a

Examinandootipodefst,agentevqueelerecebeumatuplaquecontmdoistiposeretornaoprimeiroelemento.
exatamenteporcausadissoqueconseguimosusarfstemparesquecontenhamquaisquertipos.Percebaaindaque
mesmoaebsendodiferentestiposvariveis,elesnodevemsernecessariamentedetiposdiferentes.Adeclarao
apenasnosdizqueotipodoprimeirocomponente(datupla)deveserdomesmoqueodoretorno.

BasicodeTypeclasses
UmaTypeclass(classedetipos)comoumainterfacequedefineumcomportamento.
Seumtipopartedeumatypeclass,querdizerqueelasuportaeimplementao
comportamentoespecificadopelaclassedetipo.Muitagentevindadaorientaoa
objetosseconfundeeachaestardiantedeumaclassedeOO.Bom...no.Vocpode
pensarquesocomoasinterfacesdeJava,masnaverdadesomuitomelhor.

Qualdeveserotipodafuno==?

ghci>:t(==)
(==)::(Eqa)=>a>a>Bool

Nota:ooperadordeigualdade(==)umafuno.Assimcomo+,*,,/equasetodososoutrosoperadores.Seuma
funocompostaapenasdecaracteresespeciais,elaporpadroumafunoinfixa.Sequisermosverificaroseu
tipo,passeaparaoutrafunoouchameacomofunoprefixa,colocandoaentreparnteses.

Interessante.Temosalgonovoaqui,osmbolo=>.Tudoantesdosmbolo=>denominadoclassconstraint(restriode
classe).Podemosleradeclaraodetipoanteriorassim:afunodeigualdaderecebedoisargumentosdemesmotipoe
retornaumBool.EssetipodevesermembrodaclasseEq(queaclassconstraint).

AtypeclassEqprovumainterfaceparaotestedeigualdade.Qualquertipoquefaasentidoserverificadoporigualdade
comoutrotipodeveestarnatypeclassEq.TodosostiposHaskellexcetoosdeIO(tipoparalidarcomentradaesada)e
funesfazempartedatypeclassEq.

Afunoelemtemotipo(Eqa)=>a>[a]>Boolporqueusaooperador==paraprocurarumdeterminado
elementoemumadadalista.

Algumasclassesdetipobsicas:

Eq usadoportiposquesuportamtesteporigualdade.Asfunesquefazempartedelaimplementam==e/=.Seexiste
algumaclassconstraintdeEqparaumtipovarivelemumafuno,usaooperador==ou/=emalgumlugardesua
definio.Todosostiposjmencionados(comexcessodefunes),sopartedeEq,entopodemsertestadospor
igualdade.

ghci>5==5
True
ghci>5/=5
False
ghci>'a'=='a'
True
ghci>"HoHo"=="HoHo"
True
ghci>3.432==3.432
True

Ord paratiposquetmordem.

ghci>:t(>)
(>)::(Orda)=>a>a>Bool
Todosostiposjvistos(excetofunes)sopartedeOrd.Ordenglobatodasasfunesdecomparaocomunscomo
>,<,>=e<=.AfunocomparerequerdoismembrosdeOrddemesmotipoeretornasuaordenao. Ordering uma
typeclassquepodeserGT,LTouEQ,significandomaiorque,menorqueeiguala,respectivamente.

ParasermembrodeOrd,umtipodevesermembrodoprestigiosoerestritoclubedoEq.

ghci>"Abrakadabra"<"Zebra"
True
ghci>"Abrakadabra"`compare`"Zebra"
LT
ghci>5>=2
True
ghci>5`compare`3
GT

Membrosdo Show podemserrepresentadoscomostrings.Todosostiposcobertosatagora(comexceodasfunes)


sosuportadosporShow.AfunoquelidacomatypeclassShowmaisusadaashow.Elarecebeumvalordeumque
tipopresenteemShowenosmostraessevalorcomoumastring.

ghci>show3
"3"
ghci>show5.334
"5.334"
ghci>showTrue
"True"

Read tipoumaoposiodatypeclassShow.AfunoreadrecebeumastringeretornaumtipomembrodeRead.

ghci>read"True"||False
True
ghci>read"8.2"+3.8
12.0
ghci>read"5"2
3
ghci>read"[1,2,3,4]"++[3]
[1,2,3,4,3]

Atagoratudosimples.Todosostiposjvistosestonessasclassesdetipo.Masoqueaconteceaotentarmos
read"4"?

ghci>read"4"
<interactive>:1:0:
Ambiguoustypevariable`a'intheconstraint:
`Reada'arisingfromauseof`read'at<interactive>:1:07
Probablefix:addatypesignaturethatfixesthesetypevariable(s)

OqueoGHCIesttentandonosdizerquenosabeoqueseesperarcomoretorno.Percebaquenosusosanteriores
dereadnssemprefazamosalgocomoresultado.Assim,oGHCIpodiainferirotipoesperadoderead.Seusassemos
elecomoumbooleano,elesaberiaquedeveriaretornarumBool.Masagoraelessabequedeveseralgumtipoda
classeRead.Vamosdarumaolhadanadeclaraodetipoderead.

ghci>:tread
read::(Reada)=>String>a
Viu?EleretornaumtipopartedeReadmascomonousamosoresultadodepois,elenosaberqualtiposer.porisso
quepodemosespecificarexplicitamentetypeannotations(anotaesdetipos).Anotaesdetiposservemparadizer
qualtipoquevocquerqueumaexpressoassuma.Fazemosissoadicionando::nofimdaexpressocomotipo
desejado.Observe:

ghci>read"5"::Int
5
ghci>read"5"::Float
5.0
ghci>(read"5"::Float)*4
20.0
ghci>read"[1,2,3,4]"::[Int]
[1,2,3,4]
ghci>read"(3,'a')"::(Int,Char)
(3,'a')

Namaioriadasexpresses,ocompiladorjpodeassumirqualdeveserotipodasexpresses.Masacontecedeleno
sabersedeveserIntouFloatparaumaexpressocomoread"5".Paratercerteza,Haskelldeveriaprimeiroavaliar
read"5".MascomoHaskellumalinguagemestaticamentetipada,precisasaberotipodetodasasexpressesnahora
dacompilao(ounocasodoGHCI,interpretao).EntodizemosaoHaskell:"Ei,essaexpressodessetipo,caso
nosaiba!".

Osmembrosde Enum sotiposquepossuemumaseqncia.AmaiorvantagemdatypeclassEnumpoderserusada


emrangesdelistas.Seustipostmsucessoresepredecessoresdefinidos,quepodemserconseguidospelasfunes
succepred.Fazempartedessaclasseostipos:(),Bool,Char,Ordering,Int,Integer,FloateDouble.

ghci>['a'..'e']
"abcde"
ghci>[LT..GT]
[LT,EQ,GT]
ghci>[3..5]
[3,4,5]
ghci>succ'B'
'C'

Bounded soostiposquepossuemlimitesmximoemnimo.

ghci>minBound::Int
2147483648
ghci>maxBound::Char
'\1114111'
ghci>maxBound::Bool
True
ghci>minBound::Bool
False

minBoundemaxBoundsodiferenciadosportertipo(Boundeda)=>a.Soconstantespolimrficas.

TodastuplasnovaziastambmestoemBounded.

ghci>maxBound::(Bool,Int,Char)
(True,2147483647,'\1114111')
Num umatypeclassnumrica.Seusmembrostmafunodeagircomonmeros.Vamosverotipodeumnmero.

ghci>:t20
20::(Numt)=>t

Parecequetodososnmerossoconstantespolimrficas.ElaspodemtomasaformadequalquertipodatypeclassNum.

ghci>20::Int
20
ghci>20::Integer
20
ghci>20::Float
20.0
ghci>20::Double
20.0

EssessoostiposdatypeclassNum.Severificarotipode*,descobrirqueelaaceitaqualquernmero.

ghci>:t(*)
(*)::(Numa)=>a>a>a

Recebetrsnmerosdomesmotipo.porissoque(5::Int)*(6::Integer)resultaremerroe
5*(6::Integer)funcionareretornarumInteger,jque5podetomaraformadeumIntoudeumInteger.

ParaestaremNum,otipojdeveestaremShoweEq.

Integral tambmumatypeclassnumrica.EnquantoNumincluitodososnmeros(reaiseinteiros),Integralapenas
inteiros.EssatypeclasscompostaporInteInteger.

Floating incluiapenasnmerosdepontoflutuante,entosoFloateDouble.

Umafunomuitotilparalidarcomnmeros fromIntegral .Adeclaraodoseutipo


fromIntegral::(Numb,Integrala)=>a>b.Assim,vemosqueelarecebeumnmerointeiroetransformao
emalgomaisgenrico.Issotilquandovocprecisaquetiposinteirosepontoflutuantetrabalhemjuntos.Porexemplo,a
funolengthtemumadeclaraodelength::[a]>Intaoinvsdeteralgomaisgeralcomo
(Numb)=>length::[a]>b.Achoqueestassimporrazeshistricas,oque,naminhaopinio,besteira.
Aindaassim,setentarmossomarotamanhodeumalista(length)com3.2teremosumerro,poisnopossvelsomar
umIntcomumnmerodepontoflutuante.Entoparacontornar,fromIntegral(length[1,2,3,4])+3.2funciona
perfeitamente.

NotequefromIntegraltemmaisdeumclassconstraintemsuadeclaraodetipo.Comopodever,issovlido,desde
queestejamseparadosporvrgulasdentrodeparnteses.

Comeando ndice SintaxeemFunes