Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
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.