Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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!".
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.
NotequefromIntegraltemmaisdeumclassconstraintemsuadeclaraodetipo.Comopodever,issovlido,desde
queestejamseparadosporvrgulasdentrodeparnteses.