Você está na página 1de 11

TiposeTypeclasses ndice Recurso

SintaxeemFunes
Patternmatching
EstecaptuloircobriralgumasconstruessintticasinteressantesdoHaskell,e
comearemosporpatternmatching.Patternmatchingconsistenapesquisaporpadresem
determinadosdadose,casotenhasucesso,fazeralgocomele.

Aodefinirfunes,vocpodedefinircdigosespecficosparacadapadro.Issogeraum
cdigomaisconciso,simpleselegvel.Vocpodeavaliarqualquertipodedadonmeros,
caracteres,listas,tuplas...Vamosfazerumafunobemsimplesqueverificaseonmero
dadoseteouno.

lucky::(Integrala)=>a>String
lucky7="SETE!BINGO!"
luckyx="Desculpe,tentenovamente!"

Aochamarlucky,ospadresserotestadosdecimaparabaixoe,deacordocomoresultado,executadoounoseu
corpo.Aqui,onicomododessapatterntersucessoseelafor7.Seno,vamosparaasegunda,queserexecutadade
qualquermaneiradevidoaox.Essafunoaindapoderiaserimplementadaporumaestruturaif.Masesequisermosuma
funoquedigaonmeroseoparmetroforde1at5ou"Noestentre1e5"paraoutros?Sempattern
matching,teramosqueescreverumaestruraifthenelsebemconfusa.Noentanto,comelepodemosescreverassim

sayMe::(Integrala)=>a>String
sayMe1="Um!"
sayMe2="Dois!"
sayMe3="Trs!"
sayMe4="Quatro!"
sayMe5="Cinco!"
sayMex="Noestentre1e5"

Vejaquesemovessemosaltimapattern(oelsegeral)paraotopo,semprediria"Noestentre1e5",porqueseria
sempreexecutadoparaqualquernmeroeaslinhasseguintesnoteriamoportunidadedeseremexecutadas.

Lembradafunofatorialqueimplementamosanteriormente?Definimosofatorialdeumnmeroncomosendo
product[1..n].Nsaindapodemosusarrecursividade,quecomogeralmentedefinidanamatemtica.Comeamos
explicitandoqueofatorialde01.Entodizemosqueofatorialdequalquernmerointeiropositivoelemultiplicadopelo
fatorialdopredecessor.AssimficatraduzidoparaoidiomaHaskell.

factorial::(Integrala)=>a>a
factorial0=1
factorialn=n*factorial(n1)
Essaaprimeiravezquedefinimosumafunorecursiva.RecursoimportanteemHaskelleiremosvercomcalma
maistarde.Masparadarguanaboca,veremosagoraoqueaconteceaotentarmoscalcularofatorialde,digamos,3:
tentamosdescobriroresultadode3*factorial2.Ofatorialde22*factorial1,entoatagoratemos
3*(2*factorial1).factorial11*factorial0,ento3*(2*(1*factorial0)).aiquetemoso
truquedefinimosofatorialde0comosendo1comaintenodenoexecutaraterceiralinha,entosretornamos1.O
resultadofinalseroequivalentea3*(2*(1*1)).Setivssemoscolocadoalinhaparaarecursocomoprimeira
dafuno,ozeroseriaincluidoeoclculoseriainfinito.Porissoaordemmuitoimportanteaodefinirpatternsemelhor
colocarasmaisespecficasnoincioedeixarasgeraisparaofim.

Patternmatchingtambmpodemfalhar,comonocasodedefinirmosumafunocomoessa:

charName::Char>String
charName'a'="Albert"
charName'b'="Broseph"
charName'c'="Cecil"

etentarmoschamlacomumparmetroinesperado:

ghci>charName'a'
"Albert"
ghci>charName'b'
"Broseph"
ghci>charName'h'
"***Exception:tut.hs:(53,0)(55,21):NonexhaustivepatternsinfunctioncharName

Issoacontecepornotermosumapatterngenrica.Aocriarpatterns,sempredevemosincluirpatternquecubratodasas
excessesparaqueoprogramanoparedemodoindevidocasousemosumvalorinesperado.

Patternmatchingtambmpodeserusadaemtuplas.Seprecisamosfazerumafunoquerecebedoisvetoresemum
planobidimensional(emformadepares)eosome,somamosseusxprimeiroedepoisseusy.Assimseriacomofaramos
senoconhecessemospatternmatching:

addVectors::(Numa)=>(a,a)>(a,a)>(a,a)
addVectorsab=(fsta+fstb,snda+sndb)

Bom,funciona.Masexisteummodomuitomelhordesefazeramesmacoisa.Vamosmodificaressafunoparaque
passeausarpatternmatching.

addVectors::(Numa)=>(a,a)>(a,a)>(a,a)
addVectors(x1,y1)(x2,y2)=(x1+x2,y1+y2)

Aest.Muitomelhor.Vejaquetemosumpatternpadro.OtipodeaddVectors(emamboscasos)
addVectors::(Numa)=>(a,a)>(a,a)>(a,a),entogarantimosquereceberemosdoisparescomo
parmetros.

fstesndtambmprecisamdeparmetrosempares.Masecomtriplas?Nohnenhumafunoquetrabalhecomelas,
maspodemosfazeranossaprpria.

first::(a,b,c)>a
first::(a,b,c)>a
first(x,_,_)=x

second::(a,b,c)>b
second(_,y,_)=y

third::(a,b,c)>c
third(_,_,z)=z

_significaomesmoqueemcompreensodelistas.Seocompiladornodeveseimportarcomoquehali,usamoso_.

Oquemelembraquepatternsmatchingtambmpodemserusadasemcompreensodelistas.Veja...

ghci>letxs=[(1,3),(4,3),(2,4),(5,3),(5,6),(3,1)]
ghci>[a+b|(a,b)<xs]
[4,7,6,8,11,4]

Seapatternfalhar,semoverparaoprximoelemento.

Asprriaslistaspodemserusadasempatternmatching.Vocpodecasarumpadrocomumalistavazia[]ouqualquer
padroqueinvolva:eumalistavazia.Sabendoque[1,2,3]apenasumaucarsintticopara1:2:3:[],voctambm
podeutilizaropadrooriginal.Umapatterncomox:xsircolocaracabeadeumalistaemxorestodelaemxs,ainda
queonicoelementoemxssejaumalistavazia.

Nota:Opadrox:xsmuitousado,principalmenteemfunesrecursivas.O(possvel)problemade:funcionar
apenascomlistadelength1oumaior.

Sevocquerdeixar,digamos,ostrsprimeiroselementosdeumalistanumavariveleorestoemoutra,vocpode
escreveralgocomox:y:z:zs.Sfuncionarcomlistade3oumaiselementos.

Agoraqueconseguimoscompararumpatterncomumalista,vamoscriarnossaprpriaimplementaodafunohead.

head'::[a]>a
head'[]=error"Proibidochamarheademumalistavazia,amador!"
head'(x:_)=x

Vejamossefunciona:

ghci>head'[4,5,6]
4
ghci>head'"Ol"
'O'

Excelente!Saibaaindaquesevocquiserespecificardiversasvariveis(mesmoqueumadelasseja_equeissono
sejarealmenteusadoemalgo),deveremoscolocalasentreparnteses.Percebatambmafunoerrorqueusamos.
Elarecebeumastringegeraumruntimeerror,usandoastringparanosinformaroerroocorrido.Jqueelecausaa
finalizaodoprograma,bomusalomoderadamente.Maschamarheadcomumalistavazianofazsentido,ento...
Vamosentocriarumafunomuitotilquenosdizosprimeiroselementosdeumalistadeummodomais
(des)interessante.

tell::(Showa)=>[a]>String
tell[]="Alistaestavazia"
tell(x:[])="Alistatemapenasumelemento:"++showx
tell(x:y:[])="Alistatemdoiselementos:"++showx++"e"++showy
tell(x:y:_)="Estalistaestalongademais.Vejaosdoisprimeiroselementos:"++showx++"e"++

Essafunoconsideradaseguraporqueprevumalistavazia,umalistacomapenasumelemento,umacomdoise
outracommaiselementos.O(x:[])e(x:y:[])poderiamserescritoscomo[x]e[x,y](comoalgomaissimples,
despensaseosparnteses).Aocontrriode(x:y:_),quesoparalistasdemaisdedoiselementosenopodemser
escritoscomcolchetes.

Nsjimplementamosanossaprprialengthusandocompreensodelistas.Agoratentaremosfazerusandopattern
matchingeumpoucoderecurso:

length'::(Numb)=>[a]>b
length'[]=0
length'(_:xs)=1+length'xs

Issosimilarfunodefatorialqueescrevemosanteriormente.Primeirodefinimosoresultadodovalorconhecidoa
listavazia.Issoconhecidotambmcomoedgecondition.Entonosegundopatterndividimosacoitadadalistaem
primeiroelementoeresto.Dissemosquealengthdalistaiguala1somadocomalengthdo"resto".Usamos_parao
primeiroelementoporquenonosimportamoscomoseuvalor.Percebaquenospreocupamoscomosdoislados:uma
listavazianaprimeiralinhaeumacommaisdeumelementonasegunda.

Entovamosdescobriroqueaconteceaochamarlength'com"ham".Primeiro,testadoseumalistavazia.Jque
no,passaseparaosegundopattern.Apassamosnotesteeoresultadodalength1+length'"am",porque
dividimosalistaemprimeiroerestoedescartamosoprimeiroelemento.Atatudobem.length'de"am",
semelhantemente,1+length'"m".Entoagoratemos1+(1+length'"m").length'"m"1+length'""
(quetambmpoderiaserescritocomo1+length'[]).Ejdefinimosquelength'[]0.Logo,nofimtemos
1+(1+(1+0)).

Vamosimplementarsum.Sabemosqueasomadeumalistavaziadeveser0.Escrevemosentocomoumpattern.E
tambmsabemosqueasomadeumalistaoprimeiroelementomaisasomadorestodalista.Seusarmosomesmo
mtodo,temos:

sum'::(Numa)=>[a]>a
sum'[]=0
sum'(x:xs)=x+sum'xs

Aindaexisteumacoisachamadadeaspatterns.Elessoumamonarodaquandoprecisamosusarumpatterne
continuarcomeleacessvel,mesmodepoisdeusado.Voccriaissocolocandoum@nafrentedonomedopattern.Por
exemplo,opatternxs@(x:y:ys).Esseaspatternsirfazerexatamenteamesmacoisaquex:y:ys,masvocconsegue
obteralistainteirausandoapenasxs,aoinvsrepetirtudonovamentedigitandox:y:ysnocorpodafunonovamente.
Umexemplobemsimples:
capital::String>String
capital""="Stringvazia,oops!"
capitalall@(x:xs)="Aprimeiraletrade"++all++""++[x]

ghci>capital"Dracula"
"AprimeiraletradeDraculaD"

Normalmenteusamosesserecursoaspatternsparaevitarrepetiodegrandespatternsusadasduranteadeclaraode
umafuno.

Maisumacoisavocnopodeusar++empatterns.Sevoctentarusaropattern(xs++ys),qualseriaaprimeirae
qualseriaasegundalista?Nofazmuitosentido.Fariaalgumsentidousar(xs++[x,y,z])ou(xs++[x]),maspela
estruturadaslistasissonopossvel.

Guardas,guardas!
Enquantopatternsumjeitodetercertezadequeumvalortenhaaformadesejadaetornapossvel
desmembralo,guards(guardas)soumaformadetestarseuma(oumais)propriedadessoverdadeiras
oufalsas.Seissoteparecedemaiscomumif,estnocaminhocerto.Adiferenaqueguardssomais
fceisdelerquandotmmuitascondiesefuncionambemcompatterns.

Aoinvsdepararparaexplicarasintaxe,vamosdiretocriarumafunousandoguards.Faremosuma
funosimplesquerepreendeousuriodeumaformaespecfica,dependendodoseuIMC.SeuIMC
igualsuamassadivididapeloquadradodesuaaltura.SeseuIMCestabaixode18,5,voc
consideradomagro.Seestentre18,5e25,saudvel.Entre25e30,acimadopeso.Maior,obeso.Ento,estaa
funo(elanocalcula,somentemostraamensagem)

bmiTell::(RealFloata)=>a>String
bmiTellbmi
|bmi<=18.5="Vocestaabaixodopeso!"
|bmi<=25.0="Supostamentevocestanormal.Pfff,apostoquevocfeio!"
|bmi<=30.0="Vocestagordo!Faaumadieta,gorducho!"
|otherwise="Vocumabaleia,meusparabns!"

Guardssomarcadosporpipes,seguidosdonomedeumafunoeseusparmetros.Geralmente,soalinhadose
identadosumpoucoadireita.Umguardageralmenteumaexpressobooleana.SeTrue,afunocorrespondente
executada.SeFalse,orestodalinhanoexecutadaepassadoparaaprxima.Sechamarmosessafunocom
24.3,sertestadosemenorouiguala18.5.Jqueno,oprximoguardtestado.Averificaotemsucessoao
passarpelosegundoguard,jque24,3menorque25,0.Assim,retornadooresultadodosegundoguard.

Osguardssoremanescentesdeumarvoreencadeadadeif/elsesdalinguagensimperativas,masmuitomaislegveis.
Apesardervoresdeif/elsesencadeadosseremextremamentedesaconselhados,svezesumproblemadefinidode
ummodoquenohmuitasalternativas.EmHaskell,Guardssoumasoluo.

Emvrioscasos,oltimoguardotherwise.otherwisedefinidocomotherwise=Trueeaprovatudo.muito
parecidocompatterns,quetestamporpadresaoinvsdecondiesbooleanas.Setodososguardsdeumafuno
deremFalse(enotivermosespecificadoumguardotherwise),testadooprximopattern.assimquepatternse
guardsfuncionambememconjunto.Senenhumguardoupatternseaplicar,lanadoumerro.
Eclaroquepodemosusarguardscomfunesquerecebamquantosparmetrosdesejarmos.Aoinvsdeobrigarmoso
usurioacalcularoseuprprioIMCantesdeusarafuno,vamosmodificlaparareceberalturaepesoedescobrir
automaticamnte.

bmiTell::(RealFloata)=>a>a>String
bmiTellweightheight
|weight/height^2<=18.5="Vocestaabaixodopeso!"
|weight/height^2<=25.0="Supostamentevocestanormal.Pfff,apostoquevocfeio!"
|weight/height^2<=30.0="Vocestagordo!Faaumadieta,gorducho!"
|otherwise="Vocumabaleia,meusparabns!"

Vamosdescobrirseeuestougordo...

ghci>bmiTell851.90
"Supostamentevocestanormal.Pfff,apostoquevocfeio!"

Ei!Noestougordo!MasHaskellmechamoudefeiomesmoassim.Queseja.

Vejaquenohum=depoisdonomedafunoeseusparmetros,masantesdoprimeiroguard.Muitosiniciantes
recebemerrosdesintaxeporcolocarema.

Maisumaoutrabemsimples:vamosimplementarnossoprpriomax.Senoselembra,elerecebedoisparmetrose
retornaomaior.

max'::(Orda)=>a>a>a
max'ab
|a>b=a
|otherwise=b

Guardstambmpodemserescritosemapenasumalinha,noentantoeunorecomendograasasuapoucalegibilidade,
mesmoemfunescurtas.Masparafinsdedemonstrao,poderamosescrevernossomax'assim:

max'::(Orda)=>a>a>a
max'ab|a>b=a|otherwise=b

Ugh!Nemumpoucolegvel!Prxima:nossaprpriaimprementaodecompareusandoguards.

myCompare::(Orda)=>a>a>Ordering
a`myCompare`b
|a>b=GT
|a==b=EQ
|otherwise=LT

ghci>3`myCompare`2
GT

Nota:Domesmomodoquepodemoschamarfunesinfixasusandocrasesemvoltadoseunome,podemosdefini
las.svezessetornamaisfcildeseler.

Onde!?
Onde!?
Naseoanterior,definimosumafunodecalculadoradeIMCqueeraalgoparecidocomisso:

bmiTell::(RealFloata)=>a>a>String
bmiTellweightheight
|weight/height^2<=18.5="Vocestaabaixodopeso!"
|weight/height^2<=25.0="Supostamentevocestanormal.Pfff,apostoquevocfeio!"
|weight/height^2<=30.0="Vocestagordo!Faaumadieta,gorducho!"
|otherwise="Vocumabaleia,meusparabns!"

Noteaindaquenosrepetimostrsvezes.Nsnosrepetimostrsvezes.Repetirse(trsvezes)nocdigotodesejvel
quandolevarumchutebemnomeiodatesta.Jquerepetimosaexpressotrsvezes,seriamelhorsecalculssemos
apenasumavez,gravssemosnumavarivelparausarmosnosprximoscomandosaoinvsdaexpresso.Paraisso,
modificamosnossafunoparaisso:

bmiTell::(RealFloata)=>a>a>String
bmiTellweightheight
|bmi<=18.5="Vocestaabaixodopeso!"
|bmi<=25.0="Supostamentevocestanormal.Pfff,apostoquevocfeio!"
|bmi<=30.0="Vocestagordo!Faaumadieta,gorducho!"
|otherwise="Vocumabaleia,meusparabns!"
wherebmi=weight/height^2

Colocamosapalavrachavewhere(geralmenteidentamosatondeestoospipes)edefinimosvariveisoufunes.
Essesnomessovisveisdentrodosguardsenospermitemnoficarnosrepetindo.Sedecidirmosqueiremoscalcularo
IMCdeummododiferente,precisamosmudarapenasumavez.Podemosavanarumpoucoedeixarnossafuno
assim:

bmiTell::(RealFloata)=>a>a>String
bmiTellweightheight
|bmi<=skinny="Vocestaabaixodopeso!"
|bmi<=normal="Supostamentevocestanormal.Pfff,apostoquevocfeio!"
|bmi<=fat="Vocestagordo!Faaumadieta,gorducho!"
|otherwise="Vocumabaleia,meusparabns!"
wherebmi=weight/height^2
skinny=18.5
normal=25.0
fat=30.0

Osnomescriadosnaseowheressovisveisdentrodafuno,entonotemosdenospreocuparcomelaspoluindo
onamespacedeoutrasfunes.Notetambmquetodososnomesforamalinhadosnamesmacoluna.Senoo
fizssemos,Haskellficariaconfusoenosaberiaqueelesfazempartedomesmobloco.

Associaeswherenosocompartilhadasentrediferentespatterns.Sevocquiserquevriospatternsdeumamesma
funocompartilhemumdeterminadonome,vocdeverespecificloscomoglobal.

Voctambmpodeusarwhereemconjuntocompatternmatch!Poderamosreescreverapartewheredanossafuno
anteriorcomo:

...
wherebmi=weight/height^2
(skinny,normal,fat)=(18.5,25.0,30.0)
Vamosfazeragoraoutrafunoextremamentenecessriaquerecebenomeesobrenomeeretornasuasiniciais.

initials::String>String>String
initialsfirstnamelastname=[f]++"."++[l]++"."
where(f:_)=firstname
(l:_)=lastname

Poderamosfazeressepatternmatchingdiretamentenosparmetrosdafuno(oqueresultariaemumcdigomaislimpo)
massparamostrarquepossveltambmfazerissousandoowhere.

Assimcomodefinimosconstantesemblocoswhere,voctambmpodedefinirfunes.Voltandoaonossotemade
programaosadavel,vamosfazerumafunoquepegaumalistadepesos/alturaeretornasualistadeIMC.

calcBmis::(RealFloata)=>[(a,a)]>[a]
calcBmisxs=[bmiwh|(w,h)<xs]
wherebmiweightheight=weight/height^2

Eporhojes!ArazopelaqualdemosoIMCcomoexemplodefunoquenopoderamoscalculardiretamentenos
seusparmetros.Severmosalistapassadapelafuno,veremosquecadaparpossuiumIMCdiferenciado.

Associaeswheretambmpodemseraninhadas.comumcriarumafunoedefiniralgumhelpercomsuasclusulas
comfunesedacriarfuneshelpercomsuasprpriasclusulaswhere.

Deixeestar
Muitosemelhantessassociaeswhere,existemaslet.Associaeswheretepermitemdarvaloresavariveisnofim
deumafuno,aomesmotempoquepermitemquetodafunoaveja,incluindoguards.Associaesletdovaloresa
funesetambmsoexpresses,mastemumescopomaisrestritopornoseremacessveisdentrodeguards.Assim
comotodaconstruoemHaskellquepermitedarvaloresanomes,construesletpodemserusadasempattern
matching.Vejamosemao!Poderamosfazerassimumafunoquenosdareadasuperfciedeumcilndrobaseado
emsuaalturaeraio:

cylinder::(RealFloata)=>a>a>a
cylinderrh=
letsideArea=2*pi*r*h
topArea=pi*r^2
insideArea+2*topArea

Deveseseguiraformalet<bindings>in<expression>.Osnomesdefinidosna
parteletsoacessveismesmonaexpressoseguintein.Comovocdeveter
percebido,poderamosterdefinidoessaassociaocomumwhere.Percebaainda
queosnomestambmestoalinhadosnamesmacoluna.Entoqualadiferena
dosdois?Porhora,letcolocaasassociaesantesdaexpressoqueasusa,o
contrriodawhere.

Outradiferenaqueassociaesletsoexpressesporsiprprias.whereso
apenasconstruessintticas.Lembresedequandovimosoifeexplicamosquea
estruturaif/elseumaexpressoquepodeserenfiadaemqualquerlugar?

ghci>[if5>3then"Woo"else"Boo",if'a'>'b'then"Foo"else"Bar"]
ghci>[if5>3then"Woo"else"Boo",if'a'>'b'then"Foo"else"Bar"]
["Woo","Bar"]
ghci>4*(if10>5then10else0)+2
42

Issotambmpodeserfeitocomassociaeslet.

ghci>4*(leta=9ina+1)+2
42

Elasaindapodemseralternativasparacriaoeusodefunesdeescopolocal:

ghci>[letsquarex=x*xin(square5,square3,square2)]
[(25,9,4)]

Sequisermosdefinirvriasvariveisnamesmalinha,obviamentenopodemosalinhlasemumacoluna.porissoque
tambmpodemosseparlasporpontosevrgulas.

ghci>(leta=100;b=200;c=300ina*b*c,letfoo="Hey";bar="there!"infoo++bar)
(6000000,"Heythere!")

Vocnonecessariamenteprecisasecolocarumpontoevrguladepoisdaltimaassociao.Comojdissemos,
podemosusarpatternmatchemassociaeslet.Issomuitotilparaquebrarumatuplaedarnomesacadacomponente.

ghci>(let(a,b,c)=(1,2,3)ina+b+c)*100
600

Tambmpodesecolocarassociaesletdentrodecompreensodelistas.Vamosreescrevernossoexemploanteriorque
recebelistasdeparesmassaaltura,usarumletedispensaradefiniodeumafunoauxiliarinternacomwhere.

calcBmis::(RealFloata)=>[(a,a)]>[a]
calcBmisxs=[bmi|(w,h)<xs,letbmi=w/h^2]

Inclumosoletdentrodacompreensodelistascomopredicado,masnocomaintenodefiltraralista,massimpara
apenasdarnomesaoselementos.Nomesdefinidosnumletdentrodeumacompreensodelistassovisveisfunoa
quepertence(oqueantecedeo|)eatodosospredicadoseseesqueseguemassociao.Entosimplesmente
podemosfazernossafunoretornaroIMCapenasdepessoasgordas:

calcBmis::(RealFloata)=>[(a,a)]>[a]
calcBmisxs=[bmi|(w,h)<xs,letbmi=w/h^2,bmi>=25.0]

Snopodemosusaronomeimcem(w,h)<xsporqueexecutadoantesdadefiniodolet.

Omitimosoindoletporqueusamosoemumacompreensodelistas,quejprdefineavisibilidadedenomes.No
entanto,poderamosusarletinnopredicadoeseusnomesseremacessveisapenasdentrodopredicado.Oinaindapode
seromitidoaodefinirfuneseconstantesdiretamentenoGHCI.Casoofaamos,osnomesserovisveisportodaa
sessointerativa.
ghci>letzootxyz=x*y+z
ghci>zoot392
29
ghci>letbootxyz=x*y+zinboot342
14
ghci>boot
<interactive>:1:0:Notinscope:`boot'

Vocpodeestarseperguntando:Seassociaesletsotoperfeitas,porquenouslasaoinvsdewhere?Bom,j
queassociaesletsomaisrestritivasquantoaoescopo,elasnopodemserusadasentreguards.Algumaspessoas
preferemusarwhereporqueosnomesvmdepoisdafunoqueosusam.Dessemodo,ocorpodafunoficaprximo
denomesedeclaraodetipo,tornandomaislegvel.

Expressescase
Sevocjprogramouemoutraslinguagensimperativas(C,C++,Java,etc.),sabedoque
estoufalando.pegarumavariveleexecutarblocosdecdigoespecficosparacada
valorprdefinidoepossivelmentedefinirumblocopadronocasodelaterumvalor
inesperado.

Haskellpegaoconceitoeoexpande.Comooprprionomesugere,expressescaseso,
bom,expresses,emuitosemelhantecomexpressesif/elseeassociaeslet.Nos
podemostestarexpressesbaseadasemseuvalor,comopodemostambmusarpattern
matching.Hmmmmm,pegarumavarivel,procurarporumpattern,executarblocosdecdigoparacadaresultado...onde
jviisso?Ahclaro,patternmatchingemparmetrosdefunes!Masissosumatalhoparaexecutarumaexpresso
case.Essesdoiscdigosfazemamesmacoisa,entopodeescolherqualvocprefere:

head'::[a]>a
head'[]=error"Noexisteheademlistasvazias!"
head'(x:_)=x

head'::[a]>a
head'xs=casexsof[]>error"Noexisteheademlistasvazias!"
(x:_)>x

Comov,asintaxedeexpressescasesoextremamentesimples:

caseexpressionofpattern>result
pattern>result
pattern>result
...

expressiontestadaporalgunspatterns.Patternmatchingfuncionaexatamentecomosepresume:oprimeiropattern
queverificarseverdadeiroexecutado.Setodoocaseforexecutadoenenhumpatternseencaixar,aconteceumruntime
error.

Enquantopatternmatchingdentrodosparmetrosspodemserfeitosaodefinirfunes,expressescasepodemser
colocadaspraticamenteemqualquerlugar.Olhas:

describeList::[a]>String
describeListxs="Alista"++casexsof[]>"vazia."
[x]>"umalistaunitria."
[x]>"umalistaunitria."
xs>"umalistagrande."

Elassoteisparausarpatternmatchingnomeiodeexpresses.Jquepatternmatchingemdefiniesdefunoso
umatalhoparaexpressescase,poderamosaindaterfeitodessejeito:

describeList::[a]>String
describeListxs="Alista"++whatxs
wherewhat[]="vazia."
what[x]="umalistaunitria."
whatxs="umalistagrande."

TiposeTypeclasses ndice Recurso