Sei sulla pagina 1di 26

Funcionrios,Funcionriose ndice ParaalgumasmnadasMais

Monoids

UmpunhadodeMnadas
QUANDONScomeamosaFalarSobrefunctors,VIMOSthatwereELASConceitosteispargrafoOSValoresQue
poderiamSermapeados.Entao,NstornamosEsseConceitohumPassoaMaisatravzdaINTRODUOdafunctors
aplicativas,OQueNospermitevercertosTiposdevaloresComoValorescomcontextoeutilizarfuncoesNormaissas
ValoresenquantoPreservaseosignificadoDessesConceitos.

NesteCaptulo,nosvamosEstudarSobremonads,thatAPENASreforafunctorsaplicativas.Muitosemelhantea
aplicativasfunctorsthatSOMENTEreforafunctors.

Quandoestamoscomosfunctores,vimosquepossvelmapear
Funesdevriostiposdedados.NSVIMOSthatParESSE
Propsito,otipodeclasseFunctorNosfoiapresentadooQuensa
LevouumaFazeraSeguintepergunta:QUANDOTEMOSUMtipode
Funoa>beTAMBMUMtipodedadofa,ComoNSfazemos
ParamapearESSAFunoParaTerminarcomhumtipodedadofb?
NSVIMOSComomapearSOMENTEUMTalvezum,UmaLista[a]
,umIOumetc.NSVIMOSAtComomapearUmaFunoa>b
FunopargrafoOutrafazertipor>aFunoParaObterUmafaz
tipor>b.PararesponderESSAperguntadeComomapearUmaFunopargrafoAlgumtipodedado,TudoOQue
NSTEMOSQueFazereOlharParaotipodedadofmap:

fmap::(Functorf)=>(a>b)>fa>fb

EENTOfizemosfuncionarpargrafoNOSSOSTiposdeDadosEscrevendoinstanciasIndicatodeFunctor.

EmSEGUIDAVIMOSUmapossibilidadedemelhorarcomofunctorseDizer,ei,eseESSAFunoa>bJestiver
empacotadaDentrodehumvalorfunctor?PorExemplo,esetivermosNSJust(*3),ComoNSfazemospargrafo
aplicarISSOumApenas5?EseNSNOquisermosaplicarParApenasa5masEMvezDissopargrafohum
Nada?OUSENOSTEMOS[(*2),(+4)]ComoPodemosaplicarISSOum[1,2,3]?Comoissofuncionamesmo?
PorISSO,otipodeclasseApplicativeintroduzidofoi,semquaQueremosumaRESPOSTAPARAOSeguintetipo:

(<*>)::(Applicativef)=>f(a>b)>fa>fb

Vimostambmquepodeterumvalornormaleempacotalodentrodeumtipodedado.PorExemplo,Podemoster1e
empacotalodeModoasetornarhumApenasa1.PodemosOUTransformaloem[1].OuemUmaAodeI/OQue
NOFaznadaeAPENASProduz1.AFunoqueFazISSOeChamadadepuro.
Comodissemos,umvalordeaplicativopodeservistocomoumvalorcomumcontextoadicional.Umvalorimaginrio,
incluidoemTERMOStcnicos.PorExemplo,ocaractere'a'EAPENASUMcaracterenormal,enquantothat
apenas'a'TEMAlgumcontextoadicionado.EmvezdehumChar,NOSTEMOSUMTalvezChar,QueNosDizQue
ovalorPODESerhumcaractere,masTAMBMPODESerUmaausenciadehumcaractere.

FoitimoverComootipodeclasseApplicativensapermitiuUSARfuncoesNormaissasValorescomcontextoe
ComoQueocontextofoipreservado.Observar:

ghci>(*)<$>Apenas2<*>Apenas8
apenas16
ghci>(++)<$>Apenas"klingon"<*>Nada
Nada
ghci>()<$>[3,4]<*>[1,2,3]
[2,1,0,3,2,1]

Ah,legal,gorathattratamosenguiasComoValoresdeaplicativo,TalvezumarepresentaoValorescalculadosthat
PODEMterfalhado,[a]representaoValorescalculadosQueTemVriosResultados(ClculosNOdeterminsticos),
IOdeumSoValoresQuerepresentamValoresQueTemEfeitoscolaterais,Etc.

MnadasSoExtensesnaturaisdafunctorsaplicativasecomELASEstamospreocupadoscomIsto:SeVocTEM
UMvalorcomhumcontexto,ma,ComorpidoVocAplicaIstoumUmaFunoQueTemhumcontextonormaldeume
Retornahumvalorcomhumcontexto?QuerDizer,ComorpidoVocAplicaUmaFunodotipoa>mbpargrafohum
valordotipoma?Assim,basicamentensvamosquereressafuno:

(>>=)::(Monadm)=>ma>(a>mb)>mb

Sevoctemumvalorimaginrioeumafunoquetemumvalornormalmasretornaumvalorimaginrio,como
fazemosparaestevalorimaginrioemumafuno?Estaumaquestoprincipalquevamosnospreocupar
quandomosmoslidandocommnadas.ONsescrevemosmaemvezdefaPorqueomSignificaMnada,masmonads
SoAPENASfunctorsaplicativasQuesuportam>>=.AFuno>>=EpronunciadaComoseligam.

QUANDONSTEMOSUMvalornormaldeumeUmaFunonormal,a>bERealmenteFcilAlimentarovalorda
FunorpidoVocAPENASAplicaumaFunocomovalorthatVEMCOMDeterminadocontexto,PrecisoUm
poucodePensamentoparaVerComososValoresImaginariosSoalimentadosemfunesecomolevamemcontaoseu
comportamento,masvocvaivercomofcilcomoum,doistrs.

MolhandoospscomTalvez
Agoraquenstemosumaideiasobreoquesomonades,vamosversepodetornaressaideiaumpoucomenosvaga.

ParaumgrandeSurpresadeNingum,TalvezeUmmnada,ENTOvamosexploralohumpoucoMaiseverse
PodemosCombinalocomOQueNSaprendemosSobremonads.

TenhaCertezaQuerpidoVocentendeuapplicativesAthere.SerabomserpidoVocjfigadoUmaNoode
ComoemvariasinstanciasdeApplicativetrabalhameQuetipodeClculoELASrepresentam,PorquemonadsNo
SoMaisnadafazerthatretomarONossoConhecimentoPrvioeaprimorarELE.
UmvalordotipoTalvezumarepresentaohumvalordotipoumcomo
contextoUmaPossvelfalhaanexadade.UmvalordeJust"dharma"
SignificaQueumacadeiade"dharma"Existeenquantothatovalorde
NadarepresentaoSUAausencia,OUSeVocOlharParaumaComo
cadeiahumresultadodehumClculo,ISSOSignificaQueoClculo
falhou.

QUANDONOSolhamospargrafoTalvezComoUmafunctor,VIMOS
QueseiterarmosUmaFunofmapSobreELA,ELASeramapeada
internamenteseovalorparaBasta,CasoContrriooNadaSera
mantidoPorqueNoHNadaParamapear.

Assim:

ghci>fmap(++"!")(Apenas"sabedoria")
Apenasa"sabedoria!"
ghci>fmap(++"!")Nada
Nada

Assimcomoumfunctoraplicativo,quefuncionadeforma.Aplicaestambmtmumafunodeembalarcomocoisas.
TalvezeUmaplicativofunctordetalformathat,usamosQUANDO<*>ParaaplicarUmaFunoDentrodehumTalvez
ParhumvalorQueESTDentrodehumtalvez,AmbosTEMQueSerAssimPARAOresultadoSerhumvalorAssim,
CasoContrriooresultadoENada.Fazsentidoporquevoctemumproblemaouumacoisaquevocestaplicando,
vocnopodefazernadalforacomraridade,entovoctemquepropagarumafalha:

ghci>Apenas(+3)<*>Apenas3
apenas6
ghci>Nada<*>Apenas"ganncia"
Nada
ghci>Apenasord<*>Nada
Nada

QUANDOusamosOestilosantesfuncoesaplicativopargrafoTerNormaisagindoEMValoresTalvezIstosemelhante.
DeTodososValoresTemQueSerAssim,CasoContrriotodosSoNada!

ghci>max<$>Apenas3<*>Apenas6
apenas6
ghci>max<$>Apenas3<*>Nada
Nada

EAgoravamosPensarComofaramos>>=pargrafoTalvez.ComoNOSFalamos,>>=TEMUMvalormondico,e
UmaFunoQueTemhumvalornormal,eRetornahumvalormondicoeconsegueaplicarESSAFunopargrafohum
valormondico.Comoelefazisso,umafunocomumvalornormal?Bem,parafazerisso,eletemquelevaremconta
ocontextodessevalormondico.

NesteCaso,>>=levariahumvalorTalvezumFunoEUMAquetipoa>TalvezbthatdeAlgumaManeiraAplica
umaFunoParaoTalvezum.ParaDescobrirComoELEFazISSO,PodemosUSARumIntuiothatTEMOSde
TalvezSerhumfunctoraplicativo.DigamosthatTEMOSUmaFuno\x>Just(x+1).Elapegahumnumero,
acrescenta1aELEEOembalacomhumApenas:

ghci>(\x>Apenas(x+1))1
apenas2
ghci>(\x>Apenas(x+1))100
apenas101

SealimentarmosELACOM1,ELASer,calculadaComoApenas2.SeNSdermosumaELAoNmero100,o
resultadoSeraApenas101.Muitosimples.AgoraAquivaiorampa:ComoNSalimentamoshumvalorTalvezFuno
Paraesta?SepensarmosNSSobreComoTalvezAtuaComohumfunctoraplicativo,querespondeISSOSeraMuito
Fcil.SealimentarmosISSOcomhumvalorAssim,pegarmosOQueESTADentrodepoucoseaplicarmosumNele
Funo.SederumELEUMNada,hmm,Bem,ENTOestaremoscomUmaFunoporemnada(nada)Paraaplicarnela.
NesteCasovamosAPENASFazeroQueNSfizemosAntesdeDizerQueoresultadoENada.

AoinvesdeChamarISSOde>>=,iremoschamalodeapplyMaybePORenquanto.ElaIRAPegarUMTalvezume
UmaFunothatRetornahumTalvezbemanipulaeslospargrafoaplicarESTAFunoAoTalvezum.Aquiesto
cdigo:

applyMaybe::Talvezum>(a>Talvezb)>Talvezb
applyMaybeNadaf=Nada
applyMaybe(Apenasx)f=fx

Ok,agoravamosjogarcomumpouco.VamosEUAloComoUmaFunoinfixacomovalordeTalveznoeALado
EsquerdoFunosemDiretoLado:

ghci>Apenas3`applyMaybe`\x>Apenas(x+1)
apenas4
ghci>Apenas"sorriso"`applyMaybe`\x>Apenas(x++":)")
Apenas"sorriso:)"
ghci>Nada`applyMaybe`\x>Apenas(x+1)
Nada
ghci>Nada`applyMaybe`\x>Apenas(x++":)")
Nada

NoExemploAcima,NSVIMOSthatwhenusamosapplyMaybecomhumvalorApenasEUMAFuno,umaSera
AplicadaFunoSimplesmentenovalorDentrodeapenas.QUANDOtentarmosUSARISSOCOMUMNada,o
resultadocompletoSeraNada.QuetalseaFunoretornarAPENASUMNada?Vamosver:

ghci>Apenas3`applyMaybe`\x>sex>2,emseguida,apenasxoutraNada
apenas3
ghci>Apenas1`applyMaybe`\x>sex>2,emseguida,apenasxoutraNada
Nada

Exatamenteoquensespervamos.SeovalormondicoEsquerdaeUmNada,umaCoisaTodaENada.Esea
FunoaDireitaRetornaUMNada,oresultadoNovamenteENada.IstoMUITOQUANDOsemelhanteusamosNOS
TalvezComohumaplicativoeNSobtemoshumresultadoNadaifemAlgumapartehaviahumNada.

PareceQueParTalvez,NSTEMOSQueDescobrirComotiramoshumvalorimaginrioealimentamosELECOM
UmaFunothatrecebehumvalorenormaisRetornaUMimaginrio.ONsfazemosISSOmantendoemmenteQue
humvalorTalvezREPRESENTAUMClculoQuePODEterfalhado.

Vocpodeestarperguntado,comovocpodesertil?Podeparecerqueosfunctoresaplicacionaissomaisfortesqueos
monads,quandoosfunccionadoresaplicadoresnospossuemumafunonormalparaofuncionamentodooperandoem
contextosdevalores.Vamosverqueasmespodemfazerissotambm,porqueelessoumaevoluodefunctoresde
aplicao,equetambmpodemfazeralgumacoisaquenoaplicvel.

IremosvoltarparaTalvezemhumMinuto,masPrimeiro,vamosVerificARQuetipodeclassePertenceamonads.

OtipodeclasseMnada
AssimComofunctorsTEMotipodeclasseFunctorefunctorsaplicativasTEMotipodeclasseApplicative,monads
TEMSeuPRPRIOtipodeclasse:Monad!Uau,quemadivinhado?Assimcomoessetipodeclasseseparece:

classeMonadm,onde
voltar::a>mum

(>>=)::Mum>(a>mb)>mb

(>>)::Mum>mb>mb
x>>y=x>>=\_>y

falhar::string>mum
falharmsg=msgdeerro

Vamoscomearcomumaprimeiralinha.ElaDiz:
classeMonadmonde.Masespere,nsnodizemosqueas
messoapenasreforosdefunctorsaplicativos?NO
DeveriahaverUmaRestriodeClasseAOLongodasLinhas
declasse(mApplicative)=>Mnadam,ondedevendo
ASSIMotipoSerPrimeirohumaplicativofunctorAntesde
Produzirhummnada?Bem,nodeveria,masquandoHaskell
foicriado,notinhasidofeitoparaumaboaopoparaHaskell.
Mascomcerteza,cadamnadaumfuneralaplicativo,mesmo
queumadeclaraonodizisso.

APrimeiraFunothatotipodeclasseMonaddefinirae
retorno.EoMESMOQuepura,SOMENTECOMUMnomo
diferente.EssetipoE(Monadm)=>a>ma.precisoum
valorparacolocloemumcontextopadroqueaindamantm
essevalor.Emoutraspalavras,precisoalgoparaenvolver
eleemummnada.ELEsempreFazumMESMACoisacoma
FunopuraPARAOtipodeclasseApplicative,OQue
SignificaQueJEstamosfamiliarizadoscomoretorno.
NSJusamosretornofizemosQUANDOI/O.UsamoseleparapegarumvalorefazerumaaofictciadeI/Oque
nofaznadamasqueproduzumvalor.ParTalvezELECRIAUMvaloreENVOLVEELEemhumApenas.

APENASUMlembrete:retornoNoTemnadaavercomvoltarQueUSADOnamaioriadasOUTRAS
Linguagens.Elenoterminaaexecuodafunoouqualquercoisaassim,elestemumvalornormalecolocao
elementoemumcontexto.

APrximaFunoE>>=,orbind.comoumfuncionrionormal,eletemdireitoaumvalor
normal,temumvalorcomumcontextoetemumvalornormal,Masretornaumvalor
monadico.

EmSEGUIDA,TEMOS>>.Nsnovamosprestarmuitaatenoparaacriaodeum
modelocomumaimplantaopadroenspraticamentenuncaimplementamosissopara
criarinstnciasdemnadas.

AltimaFunodotipodeclasseMonadEfalham.Nsnuncausamoselaexplicitamenteemnossocdigo.Emvez
disso,elausadaporHaskellparapermitirfalhasemumconstrutorsemnticoespecialparamnadasqueiremos
conhecerdepois.NSNOprecisamosnsapreocuparcomfalhaPORhora.

AgoraQueNSsabemosComoQueotipodeclasseMonadseParece,vamosdarUmaolhadaemComoTalvezEUMA
InstanciadeMonad!

instnciaMnadaTalvezonde
voltarx=Apenasx
Nada>>=f=Nada
Apenasx>>=F=Fx
falhar_=Nada

voltarOMESMOQuepura,ASSIMNOnsaExigeesforos.NOSfazemosOMESMOthatfizemosnenhumtipode
classeApplicativeeenvolvemosELEemhumApenas.

AFuno>>=EoMESMOQueONossoapplyMaybe.QUANDOalimentamosoTalvezumFunopargrafonossa,
NOSTEMOSEMmenteocontextoeretornamoshumNadaseovalordaEsquerdaEnadaPorqueseNoHNenhum
valor,ENTONOhnenhumaManeiradeaplicarANossaFunoNele.SehumApenaspegamosoQueEST
DentrodaFunoeaplicamosf.

PodemosNOSbrincarPORCOMaiTalvezComoSendohummnada:

ghci>retorno"oque"::TalvezCordas
Apenas"oque"
ghci>Apenas9>>=\x>retorno(x*10)
apenas90
ghci>Nada>>=\x>retorno(x*10)
Nada

NadadenovoOUEmocionantenaPrimeiraLinhaUmaVezQueJusamospuracomTalvezeNSsabemosthat
voltarEAPENASpuracomhumNomediferente.ComoPrximasDuasLinhas>>=mostramhumpoucoMais.

NotathatQUANDONOSoferecemosapenas9ParaFuno\x>retorno(x*10),oxassumiuovalor9
DentrodaFuno.PareceQuefomoscapazesdeextrairovalordeTalvezsempatternmatching.ENSAINDANO
perdemosocontextodoNossovalorTalvez,PorqueQUANDOELEEnada,oresultadodoUSO>>=vaiSerNada
also.

Andenalinha
Andenalinha
AgoraQuesabemosComoAlimentarhumvalorTalvezum
FunopargrafoUmaquetipoa>Talvezb,Tendoem
vistaocontextodeUmaPossvelfalha,vamosVER
PodemosComousar>>=variasvezespargrafolidarcom
ClculosdeVriosValoresdeTalvezum.

Pierredecidiufazerumapausaemseutrabalhonafazendade
peixesetentarcaminharemumacordabanda.Issono
ruimparaele,mastemumproblema:pssarosmantemseu
pousoempontodeequilbrio!Elesvmedescansamum
pouco,batemumpapocomseusamigosedepoisdescobrem
umaprocurademigalhasdepo.Issonocorrespondeao
nmerodeavesnoladoesquerdodobastonemsempre
igualaonmerodeavesnoladodireito.Massvezes,todos
ospssarossoosquegostamdeumladoesocomo
desequilibrase,oresultadoumaquedaembaraosapara
Pierre(eleestusandoumarededesegurana).

Digamosqueelemantmoseuequilbrio,vejaumadiferenadonmerodepssarosdoladoesquerdodobastoem
relaoaonmerodepssarosdoladodireitotrs.Assim,otempopassadodoladodireitoeosquatropssarosdolado
esquerdo,eleestnoequilbrio,masnohnenhumpssaropousarnoladoesquerdo,eleperdeoequilbrioelevaum
tombo.

VamossimularpssarospousandoevoandolongedobastoeversePierreaindaestdepoisdeumdeterminadonmero
depssaroschegandoepartindo.Porexemplo,vocpodeveroqueacontececomopatrsdeumpssaroquenotem
umladoesquerdo,emseguida,quatropssarosestnoladodireitoedepoisdopssaroqueestavanoladoesquerdo
decidirvoarparalonge.

Podemosrepresentarobastocomumsimplespardenmerosinteiros.Oprimeirocomponentevaisignificaronmerode
avesnoladoesquerdoeosegundocomponenteonmerodeavesnoladodireito:

TipoBirds=Int
digitePole=(Aves,Aves)

CriamosPrimeirohumtiposinnimopargrafoInt,chamadosdepssaros,PorqueEstamosusandoNmerosinteiros
PararepresentarQUANTOSPssarosexistem.CriamosEmSeguidahumtiposinnimode(aves,Aves)echamamos
ELEdePlo(paraNOSerconfundidocomumapessoadeascendnciapolonesa).

Emseguida,quetalcriarumafunoquerecebemumnmerodepssarosepousaelesemumladodobasto.Aqui
estoasfunes:

landLeft::Aves>Pole>Pole
landLeftn(esquerda,direita)=(esquerda+n,direita)

landRight::Aves>Pole>Pole
landRightn(esquerda,direita)=(esquerda,direita+n)
Coisamuitosimples.Vamostestalos:

ghci>landLeft2(0,0)
(2,0)
ghci>landRight1(1,2)
(1,3)
ghci>landRight(1)(1,2)
(1,1)

Parafazerospssarosvoarparaofimdensapenasrecebemosumnmeronegativodepssarospousandoemum
lado.PorquepousarhumPssaroemPoleRetonahumPole,PodemosencadearumaAplicaodelandLefte
landRight:

ghci>landLeft2(landRight1(landLeft1(0,0)))
(3,1)

QUANDOaplicamosumaFunolandLeft1Par(0,0)TEMOS(1,0).Entao,pousamoshumPssaronenhuma
DireitoLado,resultandoem(1,1).FinalmenteDoisPssarospousamsemEsquerdoLado,resultandoem(3,1).Ns
aplicamosumafunoemescrevendoprimeiroafunoedepoisescrevendoosparmetros,masaquimelhorseo
bastovierprimeiroedepoisumafunodepouso.Sefizermosumafunoassim:

x:f=fx

PodemosaplicarEscrevendoprimeiroosparmetrosedepoisumafuno:

ghci>100:(*3)
300
ghci>Verdadeiro:no
Falso
ghci>(0,0):landLeft2
(2,0)

Aousarisso,poderepetidamentepousarpssarosnobastodeummodomaislegvel:

ghci>(0,0):landLeft1:landRight1:landLeft2
(3,1)

Muitolegal!Esteexemploequivalenteaoanterior,onderepetidamenteospssarosnosobastes,pormelemais
legvel.Aqui,ESTAMAISobviothatcomeamosCOM(0,0)eDepoispousamosUMPassaronaEsquerda,DEPOIS
OutronaDireitaeFinalmenteDoisnaEsquerda.

Atagoraestbom,masoqueaconteceu10pssarospousamemumlado?

ghci>landLeft10(0,3)
(10,3)

10pssarosnoladoesquerdoeapenas3noladodireito?Pierrecairnoar!Issobastanteobvioaqui,masoque
aconteceucomumasequnciadepousosassim:
ghci>(0,0):landLeft1:landRight4:landLeft(1):landRight(2)
(0,2)

Podemospensarqueesttudocerto,masvocseguidordepassosparaaqui,vaivainotarquenohmomento4
pssarosnoladodireitoenenhumpssaronoladoesquerdo!ParaCorrigirISSO,precisamosdarMaisumaolhadaem
NossasfuncoeslandLeftelandRight.Peloquepercebemos,queremosquesejafalso.Ouseja,queremosquesejam
retornadosemumnovobastoousejaumequilbriocerto,masquefalhemseospssarospousamdeforma
desequilibrada.EQualamelhorManeiradePreototal:AdicionarhumcontextodefalhadeumhumvalordothatUSAR
Talvez!Vamosrefazeressafuno:

landLeft::Aves>Pole>TalvezPole
LandLeftn(esquerda,direita)
|abs((esquerda+n)direita)<4=Apenas(esquerda+n,direita)
|casocontrrio=Nada

landRight::Aves>Pole>TalvezPole
LandRightn(esquerda,direita)
|abs(esquerda(direita+n))<4=Apenas(esquerda,direita+n)
|casocontrrio=Nada

EmvezderetornarhumPoleESTAFunogoraRetornahumTalvezPole.Elaaindatemonmerodepssarosdo
antigobastocomoantes,masemseguidaelaverificaseopousodemuitospssarosnohdeixaPierreem
desequilbrio.UsamosguardaspargrafoVerificARseaDiferenaEntreoNmerodePssarosEOnovobastodee
menorfazerthat4.Separa,evolvemosONovobastoEMUMApenaseretornamosELE.SeNOpara,retornamoshum
Nada,indicandofalhaUMA.

Vamosveressesbebsdeumavez:

ghci>landLeft2(0,0)
Apenas(2,0)
ghci>landLeft10(0,3)
Nada

Legal!QUANDOpousamosPssarossemdeixarPierreemDesequilbrio,recebemosUmNovobastoenvolvidoemhum
Apenas.MaswhenVriosPssarosficaramemUmSLadodobasto,recebemoshumNada.Issolegal,masparece
queperdeuumahabilidadederepetidamentepousarpssarosnobasto.NSNOPODEMOSMasFazer
landLeft1(landRight1(0,0))aplicamosQUANDOPorquelandRight1Par(0,0),NSNOrecebemos
MaisUmPlo,mashumTalvezPole.landLeft1pegahumPoleeNOUMTalvezPole.

PrecisamosdeUmaManeiradeterhumTalvezPoleeAlimentarISSOpargrafoUmaFunothatleadshumPolee
RetornahumTalvezPole.Felizmente,TEMOS>>=,queFazexatamenteISSOpargrafoTalvez.Vamosdaruma
olhada:

ghci>landRight1(0,0)>>=landLeft2
Basta(2,1)

LEMBRESE,landLeft2TEMUMtipodePlo>TalvezPole.NOpoderamosSimplesmenteAlimentareste
TalvezPloQueoresultadodelandRight1(0,0),ASSIMNSusamos>>=pargrafoReceberEssevalorcom
humcontextoedevolverloumlandLeft2.>>=DeFatonsapermiteTRATARovalordeTalvezComohumvalorcom
humcontextoPorquesejogarmoshumNadapargrafoDentrodelandLeft2,oresultadoSer,NadaeUmafalhaSer,
propagada:

ghci>Nada>>=landLeft2
Nada

ComISSO,PodemosgoraencadearpousosthatPODEMfalharPorque>>=nnpermiteAlimentarhumvalormondico
pargrafoUmaFunothatleadshumvalornormal.

Aquiestumasequnciadospssarospousando:

ghci>retorno(0,0)>>=landRight2>>=landLeft2>>=landRight2
Basta(2,4)

NoIncio,usamosretornarpargrafoPegarUMbastoeEnvolverELEemhumApenas.PoderamosSimplesmenteter
AplicadolandRight2Par(0,0),ISSOseriaoMESMO,masDestaformaPodemosSerMaisConsistentesutilizando
>>=Paratodascomofuncoes.Just(0,0)EalimentadopargrafolandRight2,resultandoemapenas(0,2).Que,
PORSUAvez,alimentadopargrafolandLeft2,resultandoemapenas(2,2),eASSIMPORDiante.

Lembrese,nohexemplosdeantesdevocfalhadentrodarotinadePierre:

ghci>(0,0):landLeft1:landRight4:landLeft(1):landRight(2)
(0,2)

Issonosimulamuitobemsuainteraocomospssaros,porquenohmeioumdesequilbrio,masoresultadono
refleteisso.MasvamosvergoraComousamosapplicationsmondico(>>=)AoinvesdeAplicaesNormais:

ghci>retorno(0,0)>>=landLeft1>>=landRight4>>=landLeft(1)>>=
landRight(2)
Nada

Incrvel.Oresultadofinalrepresentaumafalha,queexatamenteoque
espervamos.Vamosvercomoesseresultadofoiobtido.Primeiro,retorno
Envia(0,0)PARAOcontextoPadro,TornandoISSOUMJust(0,0).Em
SEGUIDA,ocorreoJust(0,0)>>=landLeft1.UmavezQueo
Just(0,0)eUmvalorAssim,landLeft1EAplicadoPar(0,0),
resultandoemhumJust(1,0),PorqueOSPssarosAINDAestao
relativamenteemEquilbrio.EmSEGUIDA,Just(1,0)>>=landRight4tomalugareResultaemJust(1,4)com
oEquilbriodosPssarosAINDAintacto,emboraSOMENTEUmpouco.Just(1,4)Eenviadopargrafo
landLeft(1).ISSOSignificaQuelandLeft(1)(1,4)tomaolugar.PorcausadaformaComolandLeft
Funciona,ISSOResultaemhumNada,PorqueobastoResultanteESTAForadeEquilbrio.AgorathatTEMOSUMNada
,ELEEenviadopargrafolandRight(2),masComoISSOehumNada,oresultadoEautomticamenteNada,JA
QueNOTEMOSnadapargrafoaplicaremlandRight(2).

NSNOpoderamosterconseguidoISSOAPENASusandoTalvezComohumaplicativo.SeVoctentarISSO,rpido
VocvaiFicarpreso,porqufunctorsaplicativasNOpermitemthatOSvaloresaplicativasinterajamMuitoBemunscom
OSOutros.ELESPODEM,Muitowhen,SerUsadosParmetrosComoemUmaFunousandooestiloaplicativas.Os
operadoresdeaplicaoprocurarosresultadosdeumalimentoparaumafunodeadequaoparacadaaplicaoe
depoisdecolocarovalordeaplicaofinal,masnosomuitointerativosentresi.Aqui,porm,cadapassobaseadono
resultadoanterior.Emcadapouso,opossvelresultadoanteriorexaminadoeobastomarcadocomoequilibrado.Isso
determinaoseupostovaitersucessooufalha.

Nstambmpodemosinventarumafunoqueignoraonmeroatualdepssarosemequilbrionobastoapenas
fazendoPierredesequilibrarecair.PodemosChamarISSOdebananas:

Banana::Pole>TalvezPole
debanana_=Nada

Agorapodeencadeartudojuntocomnossospssarospousando.Elesemperfarnossocaminhofalhar,porqueignorao
queestarecebendoesempreretornaumafalha,Confira:

ghci>retorno(0,0)>>=landLeft1>>=bananas>>=landRight1
Nada

OvalorJust(1,0)Ealimentadopargrafodebanana,masProduzhumNada,queFazTudoresultaremhumNada.
Queinfeliz!

EmvezdeCRIARfuncoesQueignoramessasEntradaseAPENASretornamhumvalorpredeterminadomondico,
PodemosUSARumFuno>>,cujaaImplementaoPadroE:

(>>)::(Monadm)=>mum>mb>mb
m>>N=m>>=\_>n

Normalmente,aopassaralgumvalorparaumafunoqueignoraseusprprioseretornaraumvalorpredeterminadovalor
semperresultaramnessevalorpredeterminado.Noentanto,commonadsocontextoeosignificadodelesotambm.Aqui
estaComo>>FuncionacomTalvez:

ghci>Nada>>Apenas3
Nada
ghci>Apenas3>>Apenas4
apenas4
ghci>Apenas3>>Nada
Nada

SeVocsubstituir>>com>>=\_>,FcilverPorQueELEidadeeComoELEFaz.

PodemossubstituirNossaFunodebananasemencadeamentocomhum>>e,emSEGUIDA,comhumNada:

ghci>retorno(0,0)>>=landLeft1>>Nada>>=landRight1
Nada

Eentovamos,garantidaeobviamentefalhar!
TambemvaleapenadarUmaolhadaemComoseriasetivssemosNOFeitoumESCOLHAinteligentedeTRATAROS
ValoresTalvezComoValorescomhumcontextodefalhaeAlimentalosemfuncoesfizemosComo.Aquiestcomouma
sriedepssarospousadodeveriaparecer:

rotina::TalvezPole
rotina=casolandLeft1(0,0)de
Nada>Nada
Apenaspole1>casolandRight4pole1de
Nada>Nada
Apenaspole2>casolandLeft2pole2de
Nada>Nada
Apenaspole3>landLeft1pole3

Pousamosumpassadornoladoesquerdoeentoexaminamosumponto
devendaeumpossibilidadedesucesso.EmCasodefalha,retornamos
humNada.Emcasodesucesso,pousamosospssarosnoladodireitoe
depoisfazemosumamesmacoisanovamente.ConvertendoESSA
monstruosidadeemhumencadeamentoOrganizadodeapplications
mondicocom>>=eUmClssicoExemplodeComoumamnada
TalveznsaPoupaTempoQUANDOTEMOSQueFazerOperaes
sucessivasQueSobaseadasNASthatTALVEZfalharam.

NotaComoaImplementaode>>=PORTalvezFazexatamente
ESSAlgicadeverseovalorEnadaeseparaISSO,Retorna
imediatamentehumNadaeseNOpara,SegueAdiantecomothatthis
Dentrodeapenas.

Nessaseo,abordamosalgumasfunesevemoscomoelasfuncionammelhorseosvaloresqueelasretornam
suportassemfalhas.TransformamosESSESValoresemValoresTalvezesubstitumosaplicaesfunctorNormaiscom
>>=,ganhamosdegraahumMecanismopargrafoTRATARFalhas,Porque>>=EUSADOpargrafoPreservaro
contextodehumvalornoquaSEESTAaplicandoascomofuncoes.Nestecaso,ocontextoeraqueosvaloreseram
valorescomfalhaeassimqueaplicamosFunesparaessesvalores,apossibilidadedefalharsempreparalevadaem
conta.

Fazernotao
MnadasemHaskellsototeisqueelestmsuaprpriasintaxeespecialchamadafazernotao.Nsj
encontramosfazernotaoquandoestvamosfazendoI/OenodissemosqueeraparacolagemdevriosE/Saes
emum.Bem,comosev,fazeranotaonoapenasparaIO,maspodeserusadoparaqualquermnada.Seu
princpioaindaomesmo:colandovaloresmondicosemseqncia.Nsvamosdarumaolhadaemcomofazerobras
denotaoeporissotil.

Considereesteexemplofamiliardeaplicaomondica:

ghci>Apenas3>>=(\x>Apenas(showx++"!"))
Apenas"3!"

Estivel,feitoisso.Alimentandoumvalormondicoparaumafunoqueretornaum,nograndecoisa.Observecomo
quandofazemosisso,xtornase3dentrodolambda.Umavezqueestamosdentrodesselambda,apenasumvalor
normalemvezdeumvalormondico.Agora,oquesetivssemosoutra>>=dentrodessafuno?Vejaisso:

ghci>Apenas3>>=(\x>Apenas"!">>=(\y>Apenas(showx++y)))
Apenas"3!"

Ah,umusoaninhadade>>=!Nolambdaexterna,alimentamosapenas"!"aolambda\y>Just(showx++y).
Dentrodestelambda,oYtornase"!".xainda3porquetemosquepartirdolambdaexterna.Todoessetipodelembra
measeguinteexpresso:

ghci>deixex=3;y="!"noshowdex++y
"3!"

Aprincipaldiferenaentreestesdoisqueosvaloresnoexemploanteriorsomondicos.Sovalorescomumcontexto
defalha.Podemossubstituirqualquerumporumafalha:

ghci>Nada>>=(\x>Apenas"!">>=(\y>Apenas(showx++y)))
Nada
ghci>Apenas3>>=(\x>Nada>>=(\y>Apenas(showx++y)))
Nada
ghci>Apenas3>>=(\x>Apenas"!">>=(\y>Nada))
Nada

Naprimeiralinha,dealimentaodeumaNadaaumafunonaturalmenteresultanumaNada.Nasegundalinha,ns
alimentamosApenasa3paraumafunoeoxtornase3,mas,depois,alimentarumNadaalambdainternaeoresultado
dissoNada,oquefazcomqueolambdaparaproduzirNadabem.Portanto,estaumaespciedecomoatribuirvalores
svariveisemletexpresses,squeosvaloresemquestosovaloresmondicas.

Parailustraraindamaisesteponto,vamosescreverissoemumscriptetercadaTalvezvalorocuparsuaprprialinha:

foo::TalvezCordas
foo=Apenas3>>=(\x>

Apenas"!">>=(\Y>
Apenas(showx++y)))

Paranossalvardeescrevertodasessaslambdasirritantes,Haskelldnosfazeranotao.Issonospermiteescrevero
cdigoanteriorcomoeste:

foo::TalvezCordas
foo=afazeres
x<Apenas3
y<Apenas"!"
Apenas(showx++y)

ParececomosensganhamosacapacidadedeextrairtemporariamenteascoisasapartirTalvezvaloressemterque
verificarseasTalvezvaloressoapenasvaloresouNadavalorizaacadapasso.Comolegal!Sequalquerumdos
valoresquetentamosextrairsonada,otodoqueaexpressoresultaremumaNada.Estamosarrancandoseus
valores(possivelmenteexistentes)edeixando>>=preocuparcomocontextoquevemcomessesvalores.importante
lembrarquefazerexpressessosintaxeapenasdiferenteparaencadearvaloresmondicas.
Numfazerexpresso,cadalinhaumvalormondico.Parainspecionaro
seuresultado,usamos<.SetemosumTalvezCordasevincullocom<
aumavarivel,essavarivelserumastring,assimcomoquandousamos
>>=paraalimentarvaloresmondicasparalambdas.Oltimovalor
mondicoemfazerexpresso,comoapenas(showx++y)aqui,no
podeserusadocom<paraligaroseuresultado,porqueissonofaria
sentidosetraduziuafazerexpressodevoltaparaumacadeiade>>=
aplicaes.Emvezdisso,seuresultadooresultadodetodoovalor
mondicocolado,levandoemconsideraoapossvelfalhadequalquerum
dosanteriores.

Porexemplo,examineaseguintelinha:

ghci>Apenas9>>=(\x>Apenas(x>8))
apenasVerdadeiro

Comooparmetrodaesquerda>>=umApenasvalor,olambdaaplicadaa9eoresultadoumApenasVerdadeiro
.Sereescreverissoemfazernotao,temos:

Marysue::TalvezBool
Marysue=fazer
x<Apenas9
Basta(x>8)

Secompararmosestesdois,fcilverporqueoresultadodetodoovalormondicooresultadodoltimovalor
mondiconafazexpressocomtodososanterioresencadeadosnele.

Rotinadonossotightwalkertambmpodeserexpressocomafazeresnotao.landLeftelandRighttomarumasrie
deaveseumploeproduzirumploenvoltoemumS,amenosqueosdeslizamentostightwalker,casoemqueum
Nadaproduzido.Usamos>>=apassossucessivoscadeiaporquecadaumcontoucomoanteriorecadaumtinhaum
contextoadicionaldepossveisfalhas.Aquiestodoispssarosqueaterramnoladoesquerdo,entodoispssarosque
aterramdireitaeentoumpssaroqueaterraesquerda:

rotina::TalvezPole
rotineiras=fazer
iniciar<retorno(0,0)
primeira<landLeft2incio
segunda<landRight2primeira
landLeft1segunda

Vamosverseeleconsegue:

ghci>rotina
Apenas(3,2)

Elefaz!timo.Quandoestvamosfazendoessasrotinasporescritoexplicitamente>>=,normalmentedissealgocomo
retorno(0,0)>>=landLeft2,porquelandLeft2umafunoqueretornaumTalvezvalor.Comfazer
expressesnoentanto,cadalinhadeveapresentarumvalormondico.Ento,nsexplicitamentepassaroanteriorPole
slandLeftlandRightfunes.SensexaminamosasvariveissquaisnsligadosnossosTalvezvalores,
incioseria(0,0),primeiroseria(2,0)eassimpordiante.

Porquefazerexpressessoescritaslinhaporlinha,quepodeserparecidocomcdigoimperativoparaalgumas
pessoas.Masacoisa,elessoapenasseqenciais,poiscadavaloremcadalinhasebaseianoresultadodos
anteriores,juntamentecomseuscontextos(nestecaso,seelesconseguiramoufalharam).

Maisumavez,vamosdarumaolhadanoqueestepedaodecdigoseriasenotivssemosusadoosaspectos
mondicasdeTalvez:

rotina::TalvezPole
rotineiras=
casoApenas(0,0)de
Nada>Nada
Bastainiciar>casolandLeft2inciode
Nada>Nada
Apenasprimeira>casolandRight2primeirade
Nada>Nada
Apenassegunda>landLeft1segundo

Vejacomonocasodesucesso,atupladentroJust(0,0)tornaseiniciar,oresultadodelandLeft2inciotorna
seprimeiro,etc.

SequeremosjogaraPierreumacascadebananaemfazernotao,podemosfazeroseguinte:

rotina::TalvezPole
rotineiras=fazer
iniciar<retorno(0,0)
primeira<landLeft2incio
Nada
segunda<landRight2primeira
landLeft1segunda

Quandoescrevemosumalinhaemfazernotaosemvincularovalormondicocom<,apenascomoacolocao>>
apsovalormondicocujoresultadoqueremosignorar.Nssequenciarovalormondico,masignoramososeu
resultado,porquenoimportaoquesejaemaisbonitadoqueescrevendo_<Nada,queequivalenteaoanterior.

Quandousarfazernotaoequandousarexplicitamente>>=comvoc.Euachoqueesteexemploseprestaa
escreverexplicitamente>>=porquecadapassodependeespecificamentesobreoresultadodaanterior.Comfazer
notao,tivemosqueescreverespecificamentesobreaqualploasavessodesembarque,mascadavezqueusamos
queveiodiretamenteantes.Masaindaassim,nosdeualgumasdicassobrefazernotao.

EmDonotao,quandoligarosvaloresmondicasanomes,podemosutilizaracorrespondnciadepadres,assimcomo
emletexpresseseparmetrosdefuno.Aquiestumexemplodecorrespondnciadepadroemumfazera
expresso:

justH::TalvezChar
justH=afazeres
(x:xs)<apenas"Ol"
Returnx
Nsusamosacorrespondnciadepadroparaobteroprimeirocaracteredastring"Ol"e,emseguida,apresentla
comooresultado.EntojustHavaliadacomoapenas'h'.

Eseessacorrespondnciadepadresfalhasse?Quandocorresponderaumpadroemumafunofalhar,oprximo
padroigualado.Seocorrespondentecairatravsdetodosospadresparaumadeterminadafuno,umerrolanado
enossoprogramafalha.Poroutrolado,nocorrespondnciadepadresletexpressesresultaemumerroaser
produzidoimediatamente,porqueomecanismodecairatravsdepadresnoestpresentenoletexpresses.Quando
opadrodecorrespondnciafalhaemumafazeresexpresso,afalhafunochamada.partedoMonadtipode
classeepermitequefalhoucorrespondnciadepadropararesultaremumafalhanocontextodaMnadaatualemvezde
fazeronossoprogramafalhar.Suaimplementaopadroesta:

falhar::(Monadm)=>string>mum
falharmsg=msgdeerro

Ento,porpadro,elefazonossoprogramafalhar,masmnadasqueincorporamumcontextodepossvelfalha(como
Talvez)normalmenteimplementloporcontaprpria.PorTalvez,asuaimplementadoassim:

falhar_=Nada

EleignoraamensagemdeerroefazumNada.Ento,quandoacorrespondnciadepadrofalhaemumTalvezvalor
queestescritoemfazernotao,ovalorinteiroresultaemumNada.Issoprefervelaternossoprogramafalhar.Aqui
estumfazeraexpressocomumpadroqueestfadadoaofracasso:

wopwop::TalvezChar
wopwop=afazeres
(x:xs)<Apenas""
Returnx

Ocorrespondentepadrodefalha,demodoqueoefeitoomesmoquesealinhainteiracomopadrofoisubstitudocom
umNada.Vamostentarisso:

ghci>wopwop
Nada

Acorrespondnciadepadrofalhoucausouumafalhadentrodocontextodanossamnadaemvezdecausarumafalha
detodooprograma,oquemuitobonito.

Amnadadalista
Atagora,vimoscomoTalvezvalorespodemserencaradoscomovalorescomumcontextodefracassoecomo
podemosincorporartratamentodefalhasemnossocdigousando>>=paraalimentlosparaasfunes.Nestaseo,
vamosdarumaolhadaemcomousarosaspectosmondicosdaslistasparatrazeronodeterminismoemnossocdigo
deumamaneiraclaraelegvel.

Jfalamossobrecomoaslistasrepresentamvaloresnodeterminsticosquandosousadascomoaplicativos.Umvalor
como5determinista.Eletemapenasumresultadoesabemosexatamenteoque.Poroutrolado,umvalorcomo
[3,8,9]contmvriosresultados,portanto,podeverocomoumvalorque,naverdade,muitosvaloresaomesmo
tempo.Usandolistascomofunctorsaplicacionaismostraestenodeterminismo
muitobem:

ghci>(*)<$>[1,2,3]<*>[10,100,1000]
[10,100,1000,20,200,2000,30,300,3000]

Todasascombinaespossveisdeelementosmultiplicadoresdalistaesquerdacomelementosdalistadireitaso
includasnalistaresultante.Aolidarcomonodeterminismo,hmuitasescolhasquepodemosfazer,entotentamos
todaselas,eassimoresultadoumvalornodeterminsticotambm,squeeletemmuitosmaisresultados.

Estecontextodenodeterminismosetraduzemmnadasmuitobem.VamosiremfrenteeveroqueoMonadexemplo,
paralistasseparececom:

instnciaMnada[],onde
regressoX=[X]
xs>>=f=concat(mapafxs)
falhar_=[]

retornofazamesmacoisacomopura,entojdeveestarfamiliarizadocomoretornoparaaslistas.Elelevaum
valorecolocaloemumcontextopadromnimoqueaindarendeessevalor.Emoutraspalavras,elefazumalistaquetem
apenasumvalorcomoseuresultado.Issotilparaquandoqueremosapenasenvolverumvalornormalemumalista
paraqueelepossainteragircomvaloresnodeterminsticos.

Paraentendercomo>>=funcionaparalistas,melhorsedermosumaolhadaemaoparaganharalgumaintuioem
primeirolugar.>>=sobreatomadadeumvalorcomumcontexto(umvalormondico)ealimentloparaumafuno
quelevaumvalornormaleretornaumquetemcontexto.Seessafunoapenasproduzidoumvalornormalemvezde
umacomumcontexto,>>=noseriaassimtilporqueapsumautilizao,nocontextoseriaperdida.Dequalquerforma,
vamostentaralimentarumvalornodeterminsticoparaumafuno:

ghci>[3,4,5]>>=\x>[x,x]
[3,3,4,4,5,5]

Quandousamos>>=comTalvez,ovalormondicofoialimentadoparaafuno,tendoocuidadodepossveisfalhas.
Aqui,cuidadonodeterminismoparans.[3,4,5]umvalornodeterminsticoealimentloemumafunoque
retornaumvalornodeterminsticotambm.Oresultadotambmnodeterminstico,edispedetodosospossveis
resultadosdetomarelementosdalista[3,4,5]epasslosparaafuno\x>[x,x].Estafunotomaum
nmeroeproduzdoisresultados:umnegadoeumqueinalterado.Ento,quandousamos>>=paraalimentarestalista
paraafuno,cadanmeronegadaetambmmanteveinalterada.Oxdalambdaassumetodososvaloresnalistaque
alimentadoaele.
Paravercomoissoconseguido,podemosapenasseguiraimplementao.Primeiro,comeamoscomalista[3,4,5].
Emseguida,mapeamosolambdasobreeleeoresultadooseguinte:

[[3,3],[4,4],[5,5]]

Olambdaaplicadoacadaelementoeobtemosumalistadelistas.Finalmente,nsapenasaplainaralistaevoila!
Aplicamosumafunonodeterminsticaaumvalornodeterminstico!

Onodeterminismotambmincluioapoiofalha.Alistavazia[]praticamenteoequivalenteanada,porquesignificaa
ausnciadeumresultado.porissoqueafalhaapenasdefinidacomoalistavazia.Amensagemdeerrodescartada.
Vamosbrincarcomlistasquefalham:

ghci>[]>>=\x>["ruim","louco","rad"]
[]
ghci>[1,2,3]>>=\x>[]
[]

Naprimeiralinha,umalistavaziaalimentadanolambda.Comoalistanotemelementos,nenhumdelespodeser
passadoparaafunoe,portanto,oresultadoumalistavazia.IstosemelhanteaoquealimentaNadaaumafuno.Na
segundalinha,cadaelementopassadoparaafuno,masoelementoignoradoeafunoapenasretornaumalista
vazia.Comoafunofalhaparacadaelementoqueentranele,oresultadoumafalha.

AssimcomocomTalvezvalores,podemoscadeiadevriaslistascom>>=,propagandoonodeterminismo:

ghci>[1,2]>>=\n>['a','b']>>=\ch>retorno(n,ch)
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]

Alista[1,2]ficaobrigadoane['a','b']fica
obrigadoach.Ento,nsretornar(n,ch)(ou
[(n,ch)]),oquesignificatomarumparde(n,ch)e
colocloemumcontextomnimopadro.Nestecaso,ele
estfazendoomenorpossvellistaqueaindaapresenta
(n,ch)comooresultadoeascaractersticastopouco
nodeterminismopossvel.Seuefeitosobreocontexto
mnimo.Oqueestamosdizendoaquiesta:paracada
elemento[1,2],passarporcimadecadaelemento
['a','b']eproduzirumatupladeumelementode
cadalista.

Deummodogeral,poisoretornotemumvalore
envolveloemumcontextomnimo,elenotemqualquer
efeitoextra(comofalhandoemTalvezouresultandoem
maisnodeterminismoparalistas),massimapresentaralgocomoseuresultado.

Quandovoctemvaloresnodeterminsticosinteragindo,vocpodeversuacomputaocomoumarvoreondecada
resultadopossvelemumalistarepresentaumramoseparado.
Aquiestaexpressoanteriorreescritoemfazernotao:

listOfTuples::[(Int,Char)]
listOfTuples=afazeres
N<[1,2]
ch<['a','b']
Return(n,ch)

Istootornaumpoucomaisbvioquenassumetodososvaloresde[1,2]echassumetodososvaloresde
['a','b'].AssimcomocomTalvez,nsestamosextraindooselementosapartirdosvaloresmondicasetratlos
comovaloresnormaise>>=cuidadocontextoparans.Ocontextonestecasoonodeterminismo.

Usandolistascomafazeresnotaorealmentemelembradealgoquejvimosantes.Confiraoseguintecdigo:

ghci>[(N,CH)|n<[1,2],ch<['a','b']]
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]

Sim!Listacompreenses!Nonossoafazeresexemplonotao,ntornousecadaresultadode[1,2]eparacadatal
resultado,chfoiatribudoumresultadode['a','b']e,emseguida,alinhadevendadefinitiva(n,ch)emum
Contextopadro(umalistasingleton)paraapresentlocomooresultadosemintroduzirqualquernodeterminismo
adicional.Nestalistacompreenso,amesmacoisaaconteceu,snsnotemqueescreverretornarnofinalpara
apresentar(n,ch)comooresultadoporqueapartedeumacompreensodalistadesadafezissoporns.

Naverdade,listacompreensessoapenasacarsintticoparausarlistascomomnadas.Nofinal,compreensesde
listaelistasdeafazeresnotaotraduzirparausando>>=fazerclculosqueapresentamnodeterminismo.

Ascompreensesdelistasnospermitemfiltrarnossasada.Porexemplo,podemosfiltrarumalistadenmerospara
buscarapenasqueosnmeroscujosdgitosconteruma7:

ghci>[X|x<[1..50],'7'`elem`mostrax]
[7,17,27,37,47]

Nsaplicamosoespectculodexparatransformaronossonmeroemumaseqnciae,emseguida,vamosverificar
seocarter"7"partedessacadeia.Muitointeligente.Paravercomoafiltragemnalistacompreensestraduzlista
mnada,temosdeverificaroguardafunoeoMonadPlustipodeclasse.OMonadPlusclassetipoparamonadsque
tambmpodeatuarcomomonoids.Aquiestasuadefinio:

classeMonadm=>MonadPlusm,onde
mzero::mum
mplus::mum>mum>mum

mzerosinnimodememptydoMonoidclassetipoempluscorrespondeamappend.Comoaslistassomonidese
mnadas,podemserfeitasumainstnciadessaclassedetipos:

instnciaMonadPlus[],onde
mzero=[]
mplus=(++)
Paralistasmzerorepresentaumacomputaonodeterminsticaquenotemresultadosemtodososumclculofalhou.
mplusunedoisvaloresnodeterminsticoemum.Oguardafunodefinidacomoeste:

guarda::(MonadPlusm)=>Bool>m()
guardaVerdadeiro=return()
guardaFalse=mzero

precisoumvalorbooleanoeseverdadeiro,levaum()ecolocaloemumcontextopadromnimoqueainda
consegue.Casocontrrio,elefazumvalormondicofalhou.Aquiestemao:

ghci>guarda(5>2)::Talvez()
Apenas()
ghci>guarda(1>2)::Talvez()
Nada
ghci>guarda(5>2)::[()]
[()]
ghci>guarda(1>2)::[()]
[]

Pareceinteressante,mascomotil?Nalistamnada,nsausamosparafiltrarclculosnodeterminsticos.Observar:

ghci>[1..50]>>=(\x>guarda('7'`elem`mostrax)>>retornox)
[7,17,27,37,47]

Oresultadoaquiomesmoqueoresultadodenossacompreensodelistaanterior.Comoaguardadeconseguirisso?
Vamosprimeirovercomoguardafunesemconjuntocom>>:

ghci>guarda(5>2)>>retorno"cool"::[corda]
["Cool"]
ghci>guarda(1>2)>>retorno"cool"::[corda]
[]

Seguardasucedido,oresultadocontidodentrodeleumatuplavazia.Portanto,usamos>>ignorarquetuplavaziae
apresentaralgomaiscomooresultado.Noentanto,seguardafalhar,entoassimsertambmoretornomaistarde,
porquealimentaumalistavaziaparaumafunocom>>=sempreresultaemumalistavazia.Umguardabasicamente
diz:seestebooleanafalsa,emseguida,produzirumafalhaaqui,casocontrrio,fazerumvalordesucessoquetem
umresultadofictciode()dentrodela.Tudoissofazpermitirqueacomputaocontinue.

Aquiestoexemploanteriorreescritoemfazernotao:

sevensOnly::[Int]
sevensOnly=afazeres
x<[1..50]
guard('7'`elem`mostrax)
Returnx

Setivssemosesquecidodeapresentarxcomooresultadofinalatravsdautilizaoderetorno,alistaresultanteseria
apenasumalistadetuplasvazias.Aquiestistonovamentesobaformadeumacompreensodelista:

ghci>[X|x<[1..50],'7'`elem`mostrax]

[7,17,27,37,47]
[7,17,27,37,47]

Entofiltragemnocompreenseslistaomesmoqueusarguarda.

Amissodeumcavaleiro
Aquiestumproblemaquerealmenteseprestaaserresolvidocomonodeterminismo.Digamosquevoctemum
tabuleirodexadrezeapenasumpedaodecavaleironele.Queremosdescobrirseocavaleiropodealcanaruma
determinadaposioemtrsmovimentos.Usaremosapenasumpardenmerospararepresentaraposiodocavaleiro
notabuleirodexadrez.Oprimeironmerodeterminaracolunaemqueesteosegundonmerodeterminaralinha.

Vamosfazerumsinnimodetipoparaaposioatualdocavaleironotabuleirodexadrez:

TipoKnightPos=(Int,Int)

Ento,vamosdizerqueocavaleirocomeaem(6,2).Elepodechegara(6,1)emexatamentetrsmovimentos?
Vamosver.Secomeamosno(6,2)qualamelhorjogadaafazeremseguida?Eusei,comosobretodoseles!Ns
temosnodeterminismonossadisposio,entoemvezdeescolherummovimento,vamosapenaspegartodoseles
deumasvez.Aquiestumafunoqueassumeaposiodocavaleiroeretornatodososseusprximosmovimentos:

moveKnight::KnightPos>[KnightPos]
moveKnight(c,r)=fazer
(c',R')<[(C+2,R1),(c+2,r+1),(c2,R1),(c2,I+1)
,(c+1,R2),(c+1,R+2),(c1,R2),(c1,R+2)
]
guard(c'`elem`[1..8]&&r'`elem`[1..8])
Return(c',r')

Ocavaleiropodesempredarumpassohorizontalouverticaledoisdegrausnahorizontalounavertical,masoseu
movimentotemdeserhorizontalevertical.(c',r')assumetodososvaloresdalistademovimentose,emseguida,
guardagarantequeonovomovimento,(c',r')aindaestnotabuleiro.Seno,elaproduzumalistavazia,oque
causaumafalhaederetorno(C',r')nolevadaacaboparaessaposio.

Estafunotambmpodeserescritasemousodelistascomoumamnada,masnsofizemosaquiapenasparachutes.
Aquiamesmafunofeitocomfiltro:

moveKnight::KnightPos>[KnightPos]
moveKnight(c,r)=filtroonBoard
[(C+2,R1),(c+2,r+1),(c2,R1),(c2,I+1)
,(c+1,R2),(c+1,R+2),(c1,R2),(c1,R+2)
]
ondeonBoard(c,r)=C`elem`[1..8]&&r`elem`[1..8]

Ambosfazemamesmacoisa,assimqueescolhaumquevocpensaolhamaisagradvel.Vamosdarumgiro:

ghci>moveKnight(6,2)
[(8,1),(8,3),(4,1),(4,3),(7,4),(5,4)]
ghci>moveKnight(8,1)
[(6,2),(7,3)]

Funcionacomoumencanto!Tomamosumaposioeapenasrealizamostodososmovimentospossveisdeumasvez,
porassimdizer.Portanto,agoraquetemosumaposionodeterminsticoseguinte,nsapenasusar>>=paraaliment
loparamoveKnight.Aquiestumafunoquetomaumaposioeretornatodasasposiesquevocpodealcanara
partirdeleemtrsmovimentos:

in3::KnightPos>[KnightPos]
IN3iniciar=fazer
primeira<moveKnightcomear
segunda<moveKnightprimeiro
MoveKnightsegundo

Sevocpasslo(6,2),alistaresultantemuitogrande,porquesehvriasmaneirasdechegaraumaposioemtrs
movimentos,quesurgenalistavriasvezes.Oacimasemfazernotao:

in3iniciar=incioderetorno>>=moveKnight>>=moveKnight>>=moveKnight

Usando>>=umaveznosdtodososmovimentospossveisdesdeoincioe,emseguida,quandousamos>>=pela
segundavez,paracadaprimeiromovimentopossvel,todosospossveisprximopassocalculado,eomesmovalepara
altimajogada.

Colocarumvaloremumcontextopadroatravsdaaplicaoderetornoaelee,emseguida,alimentloparauma
funocom>>=omesmoqueapenasnormalmenteaplicarafunoaessevalor,masnsfizemoloaquidequalquer
maneiraparaoestilo.

Agora,vamosfazerumafunoquelevaduasposiesenosdizsevocpodeobterdeumparaooutroemexatamente
trsetapas:

canReachIn3::KnightPos>KnightPos>Bool
canReachIn3comearfinal=final`elem`incioin3
Geramostodasasposiespossveisemtrsetapaseentovemosseaposioqueestamosprocurandoestentre
elas.Ento,vamosversepodemoscomearapartirde(6,2)para(6,1)emtrsmovimentos:

ghci>(6,2)'canReachIn3`(6,1)
Verdade

Sim!Comocercade(6,2)para(7,3)?

ghci>(6,2)'canReachIn3`(7,3)
Falso

No!Comoumexerccio,vocpodemudarestafunodemodoquequandovocpodealcanarumaposiodooutro,
dizlhequemoveparafazerexame.Maistarde,veremoscomomodificaressafunoparaquetambmpassemoso
nmerodemovimentosaseremexecutadosemvezdeessenmerosendocodificadocomoagora.

Leisdamnada
Assimcomofunctorsaplicacionais,efunctorsantesdeles,
mnadasvmcomalgumasleisquetodasasinstnciasmonad
deverespeitar.SporquealgofeitaumainstnciadoMonadtipo
declassenosignificaqueumamnada,issosignificaapenas
quefoifeitaumainstnciadeumaclassetipo.Paraqueumtipo
sejarealmenteumamnada,asleisdamnadadevemservlidas
paraessetipo.Estasleisnospermitemfazersuposies
razoveiss obreotipoeseucomportamento.

Haskellpermitequequalquertiposejaumainstnciadequalquerclassedetipo,desdequeostiposcheckout.Eleno
podeverificarseasleismonadsegureporumtipoque,porisso,sensestamosfazendoumanovainstnciadoMonad
tipodeclasse,temosqueestarrazoavelmentecertodequetudoestbemcomasleismonadparaessetipo.Podemos
confiarnostiposquevmcomabibliotecapadroparasatisfazerasleis,masmaistarde,quandovamosfazernossas
prpriasmnadas,vamosterqueverificarmanualmenteseasleissovlidas.Masnosepreocupe,elesnoso
complicados.

Identidadeesquerda
Aprimeiraleimnadaafirmaquesetomarmosumvalor,colocloemumcontextopadrocomretornoe,emseguida,
alimentloparaumafunousando>>=,omesmoqueapenastomandoovaloreaplicarafunoaele.Paracoloclo
formalmente:

retornox>>=f amesmacoisamalditacomo fx

Sevocolharparaosvaloresmondicascomovalorescomumcontextoederetornocomotendoumvalorecoloclo
emumcontextomnimopadroqueaindaapresentaessevalorcomoresultado,fazsentido,porqueseessecontexto
realmentemnimo,alimentandoestevalormondicoParaumafunonodevesermuitodiferentedeapenasaplicara
funoaovalornormal,enaverdadenodiferenteemtudo.

ParaaTalvezmnadaretornodefinidocomoApenas.ATalvezmnadatodasobreapossvelfalha,esetemos
umvalorequerocolocloemtalcontexto,fazsentidoquetratlocomoumclculobemsucedidoporque,bem,ns
sabemosoqueovalor.AquiestumpoucoderetornodeusocomTalvez:

ghci>retorno3>>=(\x>Apenas(x+100000))
apenas100003
ghci>(\x>Apenas(x+100000))3
apenas100003

ParaalistamnadaretornocolocaalgoemumalistaSingleton.A>>=aplicaoparalistaspassasobretodosos
valoresnalistaeaplicaafunoparaeles,masumavezquehapenasumvaloremumalistaSingleton,omesmoque
aplicarafunoaessevalor:

ghci>retorno"WoM">>=(\x>[x,x,x])
["WoM","WoM","WoM"]
ghci>(\x>[X,X,X])"WoM"
["WoM","WoM","WoM"]

Nsdisseque,paraIO,usandoretornofazumaaodeI/Oquenotemefeitoscolaterais,masapenasapresentaum
valorcomoresultado.Portanto,fazsentidoqueestaleivaleparaIOtambm.

Identidadecerta
Asegundaleiestabeleceque,setivermosumvalormondicoeusamos>>=paraalimentloparavoltar,oresultado
onossovalormondicooriginais.Formalmente:

m>>=retorno nodiferentedoqueapenas m

Estepodeserumpoucomenosbviodoqueoprimeiro,masvamosdarumaolhadanoporqueledeveprender.Quando
nosalimentamosvaloresmondicasparafunesusando>>=,essasfunesassumirvaloresnormaiseretornaros
mondicas.retornotambmumtalfuno,sevocconsideraroseutipo.Comodissemos,oretornocolocaumvalor
emumcontextomnimoqueaindaapresentaessevalorcomooseuresultado.Istosignificaque,porexemplo,porTalvez
,elanointroduzqualquerfalhaeparalistas,elanointroduzqualquernodeterminismoextra.Aquiestumtestepara
algumasmnadas:

ghci>Apenas"passarse">>=(\x>retornox)
Apenas"passarse"
ghci>[1,2,3,4]>>=(\x>retornox)
[1,2,3,4]
ghci>putStrLn"Wah!">>=(\X>retornox)
Wah!

Sedermosumaolhadamaisdepertooexemplodelista,aimplementaopara>>=:

xs>>=f=concat(mapafxs)

Ento,quandonosalimentamos[1,2,3,4]pararetornar,primeiroretornomapeadoaolongo[1,2,3,4],
resultandoem[[1],[2],[3],[4]]Eentoissoficaconcatenadoetemosanossalistaoriginal.

Identidadeesquerdaedireitaidentidadesobasicamenteasleisquedescrevemcomoretornodevesecomportar.uma
funoimportanteparafazervaloresnormaisemmondicosenoseriabomseovalormondicoqueproduziufezum
montedeoutrascoisas.

Associatividade
Otextofinaldaleimnadadizque,quandotemosumacadeiadeaplicativosdefunomondicascom>>=,nodeve
importacomoelesestoaninhados.Formalmenteescrito:

Fazendo (m>>=f)>>=g comofazer m>>=(\x>fx>>=g)

Hmmm,agoraoqueestacontecendoaqui?Temosumvalormondico,meduasfunesmondicasdefeg.Quando
estamosfazendo(m>>=f)>>=g,estamosalimentandomdef,oqueresultaemumvalormondico.Ento,ns
alimentamosessevalormondicoparag.Naexpressom>>=(\x>fx>>=g),tomamosumvalormondicoe
nsalimentloparaumafunoquealimentaoresultadodefxparag.Nofcilvercomoessesdoissoiguais,ento
vamosdarumaolhadaemumexemploquetornaessaigualdadeumpoucomaisclara.

LembresequandonstivemosonossocaminhantedecordabambaPierrecaminharumacordaenquantoospssaros
pousaramemseuplodeequilbrio?Parasimularavespousandoemseuplodeequilbrio,fizemosumacadeiadevrias
funesquepoderiamproduzirfalha:

ghci>retorno(0,0)>>=landRight2>>=landLeft2>>=landRight2
Basta(2,4)

Comeamoscomapenas(0,0)edepoisligadoessevalorparaaprximafunomondico,landRight2.Oresultado
dissofoioutrovalormondicoquefoiligadoprximafunomondica,eassimpordiante.Seestivssemos
explicitamenteentreparnteses,escreveramos:

ghci>((retorno(0,0)>>=landRight2)>>=landLeft2)>>=landRight2
Basta(2,4)

Mastambmpodemosescreverarotinacomoesta:

retorno(0,0)>>=(\x>
landRight2x>>=(\y>
landLeft2y>>=(\Z>
landRight2Z)))

deretorno(0,0)omesmoqueapenas(0,0)equandosealimentloparaolambda,oXtornase(0,0).
landRightlevaumnmerodeaveseumplo(atupladenmeros)eissooquepassado.Istoresultanuma
Basta(0,2)equandoalimentaresteparaoprximolambda,Y(0,2).Istocontinuaatqueopousodeavesfinal,
produzumaJust(2,4),quenaverdadeoresultadodetodaaexpresso.

Portanto,noimportacomovocaninhavaloresdealimentaoparafunesmondicas,oqueimportaoseu
significado.Aquiestumaoutramaneiradeolharparaestalei:considerarcomporduasfunes,feg.Acomposiode
duasfunesimplementadadaseguinteforma:

(.)::(B>c)>(a>b)>(um>c)
f.g=(\x>f(xg))
Seotipodega>bedotipodefb>c,queorganizlosemumanovafunoquetemumtipodeum>c,de
modoqueseuparmetropassadoentreessasfunes.Agora,eseessasduasfunesfossemmondicas,isto,ese
osvaloresqueelasretornassemfossemvaloresmondicos?SetivssemosumafunodotipoA>mb,no
poderamossimplesmentepassaroresultadoparaumafunodotipob>mc,porqueessafunoaceitaumnormal,b,
noummondico.Poderamosnoentanto,usar>>=paraqueissoacontea.Ento,usando>>=,podemoscompor
duasfunesmondicas:

(<=<)::(Monadm)=>(b>mc)>(a>mb)>(a>mc)
f<=<g=(\x>gx>>=f)

Entoagorapodemoscomporduasfunesmondicas:

ghci>deixefx=[x,x]
ghci>deixegx=[x*3,x*2]
ghci>deixeh=f<=<g
ghci>h3
[9,9,6,6]

Legal.Ento,oqueissotemavercomaleideassociatividade?Bem,quandoolhamosparaaleicomoumaleide
composies,afirmaque f<=<(g<=<h) deveseromesmoque (f<=<g)<=<h .Estaapenasoutramaneira
dedizerque,paraasmnadas,oassentamentodasoperaesnodeveimportar.

Setraduzirmosasduasprimeirasleisdeusar<=<,entoaleideidentidadeesquerdaafirmaque,paracadafuno
mondicof, f<=<retorno omesmoqueescreverapenas f ealeideidentidadedireitodizque retorno<=<f
tambmnodiferentede f .

IstomuitosemelhanteformacomoseFumafunonormal,(f.G).higualaf.(g.h),f.idsempreo
mesmoquefeid.ftambmapenasf.

Nestecaptulo,demosumaolhadanobsicodemnadaseaprendeuaTalvezmnadaeotrabalholistamnada.No
prximocaptulo,vamosdarumaolhadaemummontedeoutrasmnadascooletambmvamosaprenderafazeronosso
prprio.

Funcionrios,Funcionriose ndice ParaalgumasmnadasMais


Monoids

Potrebbero piacerti anche