Académique Documents
Professionnel Documents
Culture Documents
FACULTADDEINGENIERA
SEDETRELEW
Carrera:APU/LicenciaturaenSistemasOrientacinPGyCPI.
Materia:Paradigmasylenguajesdeprogramacin
Ao:2014
Alumno:PazosBrunoAlfredo,MartinezAlanFederico.
Introduccin
EllenguajeObjectiveCAML,tambinllamadoOcamluO'Caml,esunlenguajede
programacinavanzadodelafamiliadeloslenguajesML(MetaLenguaje).
OcamlnacedelaevolucindellenguajeCAML,abreviacindeCategoricalAbstractMachine
Language,alintegrrselelaprogramacinconobjetos.
ElcdigofuenteenOcamlsecompilaencdigoparaunamquinavirtualoencdigode
mquinaparadiferentesarquitecturas.Esteltimocompiladorproducecdigocomparableen
eficienciaalproducidoporcompiladorescomoeldellenguajeC/C++.
Variables
EnOCaml,lasvariablesseliganasusvaloresentiempodecompilacin,amenudoutilizando
lapalabrareservadalet.Losnombresdelasvariablesdebencomenzarconminsculaso
underscore(guinbajo).
let<variable>=<expr>
Cadavariabletienesualcance,queeslaporcindelcdigoenlacualsepuedereferenciarasu
ligadura.
Cuandoseutilizautop,elalcancedeunaligaduraletestodoloquesigaenlasesin.
#letx=3
valx:int=3
#lety=4
valy:int=4
#letz=x+y
valz:int=7
Elusodein,limitaelmbitodelavariablequerepresentaaexpr1aencontrarsesolamente
dentrodeexpr2.Porejemplo:
letxx=2+3in7+x
Manejodetipos
Ocamldisponedeunanlisisdetiposestticoconinferenciadetipos,convaloresfuncionales
deprimeraclase,polimorfismoparametrizado,llamadaporpatrones,manejodeexcepciones,
recoleccindebasurayotrascaractersticasavanzadas.
Tipadoesttico:
Laverificacindelacompatibilidadentretipossellevaacabodurantetiempodecompilacin.
Deestemodonosernecesariadichacomprobacinentiempodeejecucin,loque
incrementalaeficiencia.Ademsdeestemodoseevitanloserrorestipogrficosyse
contribuyealaejecucinsegura.
Inferenciadetipos:
Elprogramadornonecesitadarningntipodeinformacinalprograma.Esellenguajeelnico
acargodededucirdesdeelcdigolostiposdelasexpresionesydeclaracionesqueposee.
Estainferenciasellevaacaboalavezquelaverificacinquehemosvistoarriba,esdecir,en
tiempodecompilacin.
Porejemplo,enlaexpresin,OCamlsabequefdebeserunafuncin,porqueesaplicadaa
algoytomaunenterocomoentrada.Nosabenadadeltipodevueltoporlafuncin.Porlotanto,
elmecanismodeinferenciatiposdeOCamlasignaraafeltipoint>'a.
#funf>f3
:(int>'a)>'a=<fun>
Polimorfismoparamtricoycdigogenrico:
Cuandounafuncinnoinformatotalmentedelaestructura/tipodeunodesusargumentos,este
argumentonoestartotalmentedefinido.
Enestecasoelparmetrosedicepolimrfico.Deestemodopodremosdesarrollarcdigo
genricoquesepodrusarcondiferentestiposdeestructurasdedatosdemodoquela
representacinexactadeestaestructuranoesnecesariasaberlaporelcdigoencuestin.
EnOcaml,cuandounainferenciadeterminaqueunaexpresionesvalidaparacualquiertipo
automaticamenteespolimorfica.Lostipospolimorficoslosdenota:a,b,cyas
sucesivamente.
Porejemplo,lasiguientefuncininvierteelordendeloselementosenuna2tuplaypuedeser
aplicadaavaloresdecualquiertipo.
#letrev2(x,y)=(y,x)
valrev2:'a*'b>'b*'a=<fun>
#rev2(1,2)
:int*int=(2,1)
#rev2(1,"hello")
:string*int=("hello",1)
Ocamlesfuertementetipadoesdecirquetodaexpresintieneuntiponicoyslopueden
aplicarsevaloresafuncionescuandoeltipodelvalorcorrespondealtipoesperadoporla
funcin.
Porejemplo(+)eslafuncinquesumadosenteros,mientras(+.)eslaquequesumados
flotantes(engenerallosoperadoresentreenterostienenunaanlogoparaflotantescuyo
nombreterminaconelcarcterpunto).
Laventajadeestetipadoeslaposibilidaddederivarautomticamenteeltipodeexpresiones
(librandoalprogramadordeesatarea).
Porejemplounaexpresincomofuny>y+.yesunafuncinquerecibeunflotanteyretorna
unflotante,loderivamossabiendoque(+.)recibedosflotantesyretornaunflotante.
Tiposbsicos:
int:enteros,comprendidosentremin_intymax_int.
float:realesencomaflotante.
bool:valoreslgicos{true/false}
char:caracteresdelcdigoASCII.Porejemplo:a(comillassimples).
string:cadenasdechars.Porejemplo:a(comillasdobles).Lacadenamssimple
eslavaca:.
Funciones
DadoqueOcamlesunlenguajefuncional,lasfuncionessonunaparteimportantedellenguaje.
VeremosahoracomolasfuncionestrabajanenOcaml.
Funcionesannimas:
Unafuncionannimaesunafuncionqueesdeclaradasinnombrealguno,parasucreacinse
utilizalapalabraclavefun,comosemuestraenelejemplo:
#(funx>x+1)
:int>int=<fun>1
Lasfuncionesannimasoperanmuysimilaracomolohacenlasfuncionesconnombre.Por
ejemplo,podemosaplicarunafuncionannimaaunargumento(elentero7)comosigue:
#(funx>x+1)7
:int=8
Opasarlesotrafuncin,elpasajedefuncionesafuncionesiterativascomoList.mapes
probablementeelcasomscomndeutilizacindelasfuncionesannimas:
#List.map~f:(funx>x+1)[123]
:intlist=[234]
Tambinpuedenguardarsedentrodeestructurascomoporejemplounalista:
#letincrements=[(funx>x+1)(funx>x+2)]
valincrements:(int>int)list=[<fun><fun>]
#List.map~f:(fung>g5)increments
:intlist=[67]
Desglosemoselejemploanterior:
fung>g5esunafuncinquetomaunafuncincomoparmetroyaplicadichafuncinal
nmero5.LainvocacindeList.mapaplicafung>g5aloselementosdentrodelalista
increments(quesonasuvez,funciones)yretornaunalistaconteniendolosresultadosde
aplicarlasfuncionesalentero5.
Funcionesconnombre:
sonmuyparecidasalasanteriores,soloquesedefinenutilizandolapalabrareservadalet.Por
ejemplo,lassiguientesdefinicionessonequivalentes:
#letplusone=(funx>x+1)
valplusone:int>int=<fun>
#plusone3
:int=4
#letplusonex=x+1
valplusone:int>int=<fun>
Funcionesconmltiplesparmetros:
Ocaml,porsupuestosoportafuncionesconmsdeunparmetro.Veamosunejemplo:
#letabs_diffxy=abs(xy)
valabs_diff:int>int>int=<fun>
#abs_diff34
:int=1
Lafuncinretornaladiferenciaabsolutaentrelosparmetrosxey.
FuncionesRecursivas:
Tambinsoportafuncionesrecursivas,haciendousodelacombinacindepalabrasreservadas
letyrec.
#letrecis_evenx=
ifx=0thentrueelseis_odd(x1)
andis_oddx=
ifx=0thenfalseelseis_even(x1)
valis_even:int>bool=<fun>
valis_odd:int>bool=<fun>
#List.map~f:is_even[012345]
:boollist=[truefalsetruefalsetruefalse]
#List.map~f:is_odd[012345]
:boollist=[falsetruefalsetruefalsetrue]
Tuplas
Unatuplaesunacoleccinordenadadevaloresquepuedenserdediferentestipos.Podemos
creartuplasuniendovaloresconunacoma.
#leta_tuple=(3,"three")
vala_tuple:int*string=(3,"three")
Podemosextraerlosvaloresparatratarlosindividualmente:
#let(x,y)=a_tuple
valx:int=3
valy:string="three"
Enestecaso,letmatcheaelpatrn(x,y)conlosvalorescontenidosdentrodelatupla.Enel
ejemplodeladerechasepuedeobservarsuuso.
Listas
Lastuplasnospermitanalmacenarunnmerofijodeitemsypotencialmentedetipos
diferentes.
Laslistasnospermitenguardarunnmerodeitemsdelmismotipo.
#letlanguages=["OCaml""Perl""C"]
vallanguages:stringlist=["OCaml""Perl""C"]
OcamltraeintegradounmdulollamadoList,queproveeoperacionesparatrabajarconlistas.
Porejemplo:
#List.lengthlanguages
:int=3
#List.maplanguages~f:String.length
:intlist=[541]
Elprimero,retornalalongituddelalistamientrasqueelsegundoretornalaaplicacindela
funcinString.lengthacadaelementodelalistadadacomoparmetro,atravsdelusodela
funcinList.map.
Operador::.Permiteagregarelementoselementosadelanteenunalista,sinmodificarlalista
original.Porejemplo:
#"French"::"Spanish"::languages
:stringlist=["French""Spanish""OCaml""Perl""C"]
Sinembargo,lalistaoriginalpermaneceintacta.Noteseademas,queparasepararelementos
deunalistaseutiliza(),enlugarde(,).Lascomassonparasepararelementosdeunatupla,
conloquesiaplicamos(,)alalistaanterior,nosdevolveraunalistaquecontieneunatupla
conloselementosdadosanteriormente.
#["OCaml","Perl","C"]
:(string*string*string)list=[("OCaml","Perl","C")]
Opciones
Sonutilizadasparaexpresarqueunvalorpuedeonoestarpresenteenunaexpresin.
#letdividexy=
ify=0thenNoneelseSome(x/y)
valdivide:int>int>intoption=<fun>
*SeutilizanlaspalabrasreservadasNoney/oSomeparaindicarquenosedevuelvenadaose
devuelvealgocorrespondientemente.
Sepuedepensarenqueunaopcinesunalistaespecializadaquetieneceroounelemento.
LasopcionessonimportantesporquesonelmodocomnenelqueOCamlcodificaqueun
valorprobablementenoestdondecorresponde,locualindicaquenoexistetalcosacomo
NullPointerExceptionenOCaml.
Otrasestructuras
Porltimo,semencionan2estructurasdedatosmanejadasporOCaml:RegistrosyArrays.
#typepoint2d={x:floaty:float}
typepoint2d={x:floaty:float}
#letp={x=3.y=4.}
valp:point2d={x=3.y=4.}
Laprimersentencianosdejacrearuntipollamadopoint2dyesunregistrocon2elementos,
ambosdetipofloat.
Lasegunda,nosdejadeclararunavariabledeltipoquehabamoscreadoantes.
#letnumbers=[|1234|]
valnumbers:intarray=[|1234|]
#numbers.(2)<4
:unit=()
#numbers
:intarray=[|1244|]
Laprimersentencianosdejacrearunarraycon4elementos,todosellosenteros.
Lasegundanosdejainsertarenlaposicin2,elvalor4ylaltimamuestraloquetieneelarray
actualmente.
Expresionesyenunciados
Lasexpresionesquecontienenoperadores,rigensuasociatividadyprecedenciadeacuerdoa
lasiguientetabla:
Operador Asociatividad
!...,?...,~... Prefix
.,.(,.[
functionapplication,
constructor,assert,lazy
Leftassociative
,. Prefix
**...,lsl,lsr,asr Rightassociative
*...,/...,%...,mod,land,
lor,lxor
Leftassociative
+...,... Leftassociative
!...,?...,~... Prefix
.,.(,.[
functionapplication,
constructor,assert,lazy
Leftassociative
,. Prefix
**...,lsl,lsr,asr Rightassociative
*...,/...,%...,mod,land,
lor,lxor
Leftassociative
+...,... Leftassociative
CastingImplcitovs.Explcito
OCamlnuncahacecastsimplcitos,porejemploloquedevuelvelaexpresin1+2.5esun
errordetipo.Eloperador+enOCamlrequiere2intcomoargumentos,yenlaexpresinunode
ellosesfloat,conloquesereportaunerror.
Pararealizartaloperacinsonnecesarios2pasos:cambiareloperadordesumaparaenteros
(+)porelapropiadoparasumarflotantes(+.)yporotrolado,convertirelenteroenflotantepor
mediodeuncastexplcito,comosigue:(float_of_inti)+.fdondeelfloatesf,elenteroesiy
float_of_intesunafuncinquetomaunenterocomoparmetroyretornaunfloat.
Funcionessimilares:int_of_float,char_of_int,int_of_char,string_of_int,etc.
RazonesporlascualesOCamlutilizacastingexplcitoynopermiteelimplcito
Necesitaqueseaexplcito,demodoquepermitahacerlainferenciadetipos.
Reduceeltiempodedebuggingenrelacinconerroresdetipo(seproducenamenudoy
llevatiempoencontrarlos).
Algunoscastssonoperacionescostosas,enparticularint<>float(bidireccional).
Alternativas:
OCamlproveelas2versionesmscomunesdelassentenciascondicionales.
If<condicion_booleana>then<sentencias>o
If<condicion_booleana>then<sentencias>else<sentencias>
Expresndosedelsiguientemodo:
#letmaxab=ifa>bthenaelseb
valmax:'a>'a>'a=<fun>
Ntesequemaxespolimrfica,conlocualtodolosiguienteesvlido:
#max35
:int=5
#max3.513.0
:float=13.
#max"a""b"
:string="b"
Llegadoelcasodenecesitarifsanidados,sepuedenusarparntesisobeginendparaagrupar
lassentenciaspertenecientesaunthenoaunelseparticular.
BucleFor:
Sondelaforma:
fori=1ton_jobs()do
do_next_job()
done
EnOCamlnoexistenloscortesbreakocontinue,encambio,permitelanzarunaexcepcin
llegadoelcasoystaesatrapadaafuera.
BuclesWhile:
Seescriben:
whilebooleanconditiondoexpressiondone
Recordarquenoexistenlaspalabrasreservadasbreakocontinue,conloquesoloquedan2
modosdesalirdeunbucle:medianteunaexcepcinomedianteunareferenciaaunvalor
booleano,comoporejemplo:
letquit_loop=reffalsein
whilenot!quit_loopdo
print_string"Haveyouhadenoughyet?(y/n)"
letstr=read_line()in
ifstr.[0]='y'then
quit_loop:=true
done
Dondeeloperador(!),realizaladesreferenciaapropiadaparaobtenerelvalordelavariable.
Excepciones:
nodifierendelasexcepcionesdeotroslenguajescomojava,C#yPython.
#3/0
Exception:Division_by_zero.
Podemoscrearnuestraspropiasexcepciones:
#exceptionKey_not_foundofstring
exceptionKey_not_foundofstring
#raise(Key_not_found"a")
Exception:Key_not_found("a").
Tambinproveeunmecanismoparaatraparlasconelbloquetry/with:
#letlookup_weight~compute_weightalistkey=
try
letdata=List.Assoc.find_exnalistkeyincompute_weightdata
with
Not_found>0.
vallookup_weight:compute_weight:('a>float)>('b,'a)List.Assoc.t>'b>
float=<fun>
Patternmatching:
Esunarreglodeelementossintcticamentecorrectocomoconstantesdetiposprimitivos(int,
bool,char)variables,constructoresyelsmbolo(_),quefuncionacomouncomodnde
patrones,entreotros.
Seaplicaavalores.seutilizaparareconocerlaformadeesosvaloresycomputarlosdel
modocorrectoasociandocadapatrnalaexpresincorrespondiente.
#letimplyv=matchvwith
(true,true)>true
|(true,false)>false
|(false,true)>true
|(false,false)>true
valimply:bool*bool>bool=<fun>
Sepresentalatabladeverdaddelaoperacinlgicaimplica,vsercomparadoconlas
expresionesdelaizquierda,sialgunacoincidelafuncindevolverelvalorlgico
correspondiente.
Otroejemplo:
utilizandoelcomodndepatrones(_)
#letis_zeron=matchnwith
0>true
|_>false
valis_zero:int>bool=<fun>
Outilizandocombinacionesdepatrones:
#letis_a_vowelc=matchcwith
'a'|'e'|'i'|'o'|'u' >true
|_ >false
Encapsulamientoyabstraccin
ObjetosyClases:
OCamlesunlenguajeorientadoaobjetos,imperativoyfuncional.Mezclaesosparadigmasy
nospermiteutilizarelquemsseadecuealproblemaaresolver.
Elpatrnutilizadoparacrearunaclasees:
classname=
object(self)
...
end
Entreladefinicindelobjetoylapalabrareservadaend,sepermitedeclararvariablesy
mtodos.Veremosacontinuacin,unejemploquedefineunaclasellamadastack_of_ints(pila
deenteros)ysusmtodos:push,pop,pickysize.
#classstack_of_ints=
object(self)
valmutablethe_list=([]:intlist)
methodpushx=the_list<x::the_list
methodpop=letresult=List.hdthe_listinthe_list<List.tlthe_list
result
methodpeek=List.hdthe_list
methodsize=List.lengththe_list
end
Luegoinstanciamos:
#lets=newstack_of_ints
Yoperamossobreella:
#fori=1to10do
s#pushi
done
:unit=()
#whiles#size>0do
Printf.printf"Popped%doffthestack.\n"s#pop
done
Lasalidaser:
Popped10offthestack.
Popped9offthestack.
Popped8offthestack.
Popped7offthestack.
Popped1offthestack.
OCamltambinsoportaclasespolimrficas:
veamosladefinicindelapilaanterior,peroestavezpudiendoserfuncionalacualquiertipode
dato(representadopora).
#class['a]stack=
object(self)
valmutablelist=([]:'alist)
methodpushx=list<x::list
methodpop=letresult=List.hdlistinlist<List.tllistresult
methodpeek=List.hdlist
methodsize=List.lengthlist
end
Sucorrespondienteinstancia:
#lets=newstack
vals:'_astack=<obj>
#s#push1.0
:unit=()
#s
:floatstack=<obj>
Herencia,clasesvirtualeseinicializadores:
LaherenciatambinestsoportadaenOCaml.Slobastaconmencionarenladefinicinde
nuestraclase,elnombredelaclasedelacualqueremosheredar.Porejemplo,nuestraclase
anteriorstack,tieneunasubclasequeimplementaelmtodoprint.
#classsstack=object
inherit[string]stack
methodprint=
List.iter~f:print_stringv
end
Herenciamltiple:
Unodelosproblemasdeestetipodeherenciaeslaresolucindenombrescuandounmtodo,
porejemplo,estdefinidoenmsdeunaclasepadreconelmismonombre.Concual
definicindebenuestraclasequedarse?OCaml,loresuelvecomoseresuelvenlasinclusiones
textuales,laltimaeslaquegana.
Lasclasesvirtuales:
sonaquellasenlascualessusatributosomtodossondeclaradosperonoimplementados,
conlocualesatareaquedaparaquienheredededichaclase.Lasclasesvirtualesnopueden
serinstanciadas.
#classvirtualwidget(name:string)=
object(self)
methodget_name=
name
methodvirtualrepaint:unit
end
Puedeobservarsequelaclasewidgetesvirtualyquienesheredendeelladebernimplementar
siosielmtodorepaint.
Asuvez,seobservaqueenladeclaracindelaclasewidgetseesperaunparmetro(detipo
string),quesirveparainicializarlaelobjeto.
MtodosPrivados:
losmtodosenOCamlpuedendeclararseprivados,loquesignificaquepodrnserinvocados
porlaclasequelodefineysussubclases.Deotromodosontotalmenteinvisibles.(Similaralos
mtodosprotecteddeC++).
Mdulos:
Enestelenguajecadapiezadecdigonormalmenteseencuentraenvueltaenunmdulo.
Laslibreras(incluyendolaestndar),proveencoleccionesdemdulos.Porejemplo,List.iteres
lainvocacinalafunciniterdelmduloList.
Sinosotrosutilizamosamenudoalgunafuncin,nosconvienehacerlaaccesibleyparaello
estlaprimitivaOpen.
#openPrintf
letmy_data=["a""beautiful""day"]
let()=List.iter(funs>printf"%s\n"s)my_data
Unmdulopuedeproveermuchascosas(funciones,tipos,submdulos,etc.)alprogramaque
loestutilizando.Sinadaespecialserealiza,cualquiercosadefinidaenunmduloesvisible
desdeelexterior.Haysituacionesenlasquenoesdeseablequeestosuceda,porlocualse
defineninterfacesy/oprototipos.
Estosactuarncomounamscarasobrelaimplementacininternadelmdulo.(Similara
comolohacenlosprototiposenC,nosmuestranquefuncionestenemosdisponiblesperono
quefuncionamientointernotienenestas).
UnmduloenOCamltieneextensin.ml,unmdulointerfazdelmismotendrextensin.mli
(Parecidoalos.hdeC).
TiposAbstractos:
nospermitencreartiposdentrodelosmdulos,porejemploeltipodate.
typedate={day:intmonth:intyear:int}
Aparecen4opcionesparamanejarestasituacinenunsubmdulo:
1. Seomiteenlainterfaz(lohaceinutilizableparaquienesmanejenelmdulo).
2. Ladefinicinsecopiatalcualenlainterfaz(completamentevisibleparalosusuarios).
3. Eltiposehaceabstracto(Sloseconoceelnombre).
4. Loscamposdelregistrosondeslolectura.(Sehacenprivados).
Parausaruntipoabstracto,nobastaconelnombre.Esnecesariodisponerdeoperaciones
paramanipularlo,enelcasoanterior,tendremos:
typedate
valcreate:?days:int>?months:int>?years:int>unit>date
valsub:date>date>date
valyears:date>float
Functores:
Son,paraexplicarlosencillamente,funcionesquevandemdulosenmdulosyprobablemente
ocupenellugardelacaractersticamscomplejadellenguaje.
Sirvenparacorregirproblemasrelacionadosconlaestructuracindelcdigoy/oproblemas
como:
Inyeccindedependencias:
hacenquelasimplementacionesdealgunoscomponentesseanintercambiables.Favorecela
modularizacinparapruebasdeunidad,etc.
Autoextensindemdulos:
permitenextenderlosmdulosenunmodoestandarizado.
Instanciandomdulosconestado:
losmdulostienenestadosmutablesysignificaqueocasionalmentenecesitaremostener
mltiplesinstanciasdeunmduloparticularyc/uconsupropioestado.Losfunctoresnos
automatizanlatareadeconstruccindedichosmdulos.
Losfunctores(sondefinidoscomomdulosespeciales),permitenrecibirotrosmduloscomo
parmetros:
moduleMake_LOffset
(V:Lattice_With_Isotropy.S)
(LOffset:Offsetmap.Swithtypey=V.tandtypewiden_hint=
V.widen_hint)=
struct
end
Enestecaso,elmdulocreadoMake_LOffset,recibe2mdulos:VyLOffsetquesonasuvez
obtenidosdesusinterfacesLattice_With_Isotropy.SyOffsetmap.S.Tambinsedefinen
constraintsparalostiposcontenidosqueformarnpartedelmdulocreado,mediantelas
primitivaswithtypeandtype.
OCamlnosoportaoperadorespolimrficos(numricosodecualquiertipo).Comoejemplo
trivial,tenemoslafuncin(+),quesirveparasumarenterosylafuncin(+.)quesirvepara
sumarnmerosreales.
Estadistincineliminamuchosbugsrelacionadosconconversionesaelementosdediferentes
tamaos(conversionesint<>float,porejemplo).Loquesignificaqueelcompiladorsabe
exactamentelostiposdenmerosqueseestnusando,lesimplificaencontrarerrorespor
partedelprogramador(suposicioneserrneasdetipo).
Lasolucinesutilizarconversionesexplcitas,comoseexplicanteriormente.
Concurrencia
OCamlcontieneunalibrerallamadaAsyncqueofreceunmodelodeconcurrenciacooperativa.
Normalmente,lasaccionescomoleerdelaentradaestndaryescribirenellapuedenser
bloqueantes.EnAsynclasfuncionesnuncasebloquean,devuelvenunvalordetipoDeferred.t
queactacomocontenedordelresultado.
Unvalordeestetipoesesencialmenteunmedioparaunvalorquesercomputadoafuturo.
#letcontents=Reader.file_contents"test.txt"
valcontents:stringDeferred.t=<abstr>
#Deferred.peekcontents
:stringoption=None
Enesteejemplo,sellamaalaoperacinReader(traerelcontenidodelarchivo)yluegoa
Deferred.peekquedeberamostrarelvalordelcontenido.SinembargosucontenidoesNone,
estoesasyaqueenestecasoeselschedulerdelalibreraAsyncquiendecidecuando
corrernlasaccionesdeI/O.
Mnadas:
Losprogramaspuramentefuncionalespuedenusarlasmnadasparaestructurar
procedimientosqueincluyanoperacionesensecuenciacomoaquellosencontradosenla
programacinestructurada.
Muchosconceptosdeprogramacincomunespuedenserdescritosentrminosdeestructuras
demnadas,incluyendolosefectossecundarios,laEntrada/salida,asignacindevariables,el
manejodeexcepciones,concurrencia,etc.
ElmduloDeferreddeOCamlhaceinclusindeotrollamadoMonadquepermiteprogramarde
manerasecuencialelusodelasvariablesdeferred,dadoquesuvalorpuedenoestar
determinadohastaciertomomento.
Monitores:
Lassentenciastry_withsonunexcelentemododemanejarexcepcionesenAsync,peroesono
estodo.TodoslosmecanismosdemanejodeexcepcionesdelalibreraAsyncincluyenun
sistemademonitores,inspiradosenelmecanismodemanejodeerroresdeErlangconel
mismonombre.Suelenserdebajonivelyocasionalmenteseusandirectamente.
EnAsync,unmonitoresuncontextoquedeterminaquhacerconunaexcepcinsinmanejar.
Cadatareaasincrnicacorredentrodealgncontextomonitor.
Enlaprcticararamenteseutilizanmonitoresexplcitamente,enlugardeelloseusan
mayoritariamentefuncionesquecontienenbloquestry_with.Unejemplodeusodemonitoresde
lalibreraenmododirectoesTcp.Server.createquemanejaexcepcioneslanzadasporlalgica
quecontrolalaconexinalaredylarespuestaaunrequerimientodado(request).
Encadacasosepuederesponderconunaexcepcinquecierrelaconexionsiestoes
necesario,Obienaprovecharlosmonitoresparaconstruirlalgicademanejodeerroresde
acuerdoaloqueresultemstil.
Paradigmadeprogramacion
Aquparadigma/spertenece?
OCamlesmultiparadigma,poseeaspectosquelohacentantofuncionalcomoorientadoa
objetoseimperativo.
Funcionesannimas,polimrficas,pasadasydevueltasporparmetros,etc.
ManejodeClases,objetos,herencia,clasesvirtuales(abstractas)ypolimorfismo,entreotros.
Conceptosfuncionales:
Funcionesannimas
Funcionespolimrficas
Pasajeydevolucindefuncionescomoparmetros.
ConceptosdePOO:
Clases
Objetos
Herencia(simpleymltiple)
Clasesvirtuales(abstractas)
Polimorfismo
EncapsulamientoyAbstraccin.
ComparacinconHaskell
DeberamospensarenOCamlcuandonuestrosrequerimientosseencuentrenentrelos
siguientes:
Necesitamosprogramasmsrpidos
Queremosevitarelusodemnadas
Necesitamosobjetos
Necesitamosunsistemamspoderosodemdulos.
VentajadeOCamlconrespectoaHaskell:
LosfunctoresdeOCamlomdulosparamtricos/dealtonivel,sonmejoresqueelsistemade
mdulossimplistadeHaskell.
DesventajasdeOCamlconrespectoaHaskell
Lalibreraestndardehaskellresultamssatisfactoria.Comoejemplomuchasdelas
funcionesprocesadorasdelistasenlalibreraestndardeOCamlnoposeenrecursividadde
colaloquepuedeprovocardesbordamientosdepila.
Engeneral,seobservaquetodoelsistemadelibrerasdeHaskellestunpocomsmadurado
queeneldeOCaml.
OCamlnosoportaparalelismoenmultiprocesador.
LacombinacindeprogramacinenPOOyfuncionalpuedeserunfactordedistraccinparael
programador,queengeneralseinclinamsporelparadigmafuncional.
Otrosfactores:
Faltadeevaluacinperezosa.(puedeserbuenoymalo)
Porunladolaevaluacinperezosahaceposibleexpresarlascosasdeunmodomsclaro.por
otrolado,escomntenerprdidasdeespacioenprogramashaskelldebidoaquetodoes
evaluadoperezosamentepordefecto.
OCamlnoespuro.estousualmentehacequesetiendaatenerunestilodeprogramacinms
imperativo.Podramosincluso,enprincipio,perdertransparenciareferencial,locualesbueno
tener.
Enalgunoscasoslacapacidaddeprogramarimperativamentepuedesermasexpresivoyaque
debemoshacermenosmonadas.(seevitaengranparteelusodelasmnadas,loquetrae
claridadallenguaje).
ComparacinconC++
EnunejemploimplementandounraytracerenC++yOcamlsepuedeobservarqueelcodigo
Ocamlesde47%mscortoytambinessignificativamentemsrpidoqueeldeC++en.La
brevedaddelaaplicacinOcamlsepuedeatribuiravariosfactoresdiferentes:
Lainferenciadetipoeliminalanecesidaddeespecificarlostiposexplcitamenteunay
otravez.
TiposVariantsonmuchomsconcisoquecualquieradelasalternativasposiblesenC+
+(unajerarquadeherenciaporejemplo).
NohaynecesidaddefuncinytiposdevariablesenOcaml(graciasalainferenciade
tipos).
Nohaynecesidaddeescribirconstructoresparatuplas,registrosytiposdevariantesen
Ocaml.
ListasnativosenOcaml.
FuncionesdeordensuperiorenlugardebuclesenOcaml.
Bibliografia
http://ocaml.org/learn/tutorials/
https://realworldocaml.org/v1/en/html/
http://www.appliedcuriosity.eu/blog/post/19/ocamlvshaskellfromahaskellperspective
http://www.ffconsultancy.com/ocaml/benefits/polymorphism.html
https://ocaml.janestreet.com/ocamlcore/109.27.00/doc/async_core/Deferred.html
http://es.wikipedia.org/wiki/M%C3%B3nada_(programaci%C3%B3n_funcional)
http://www.cs.cornell.edu/courses/cs3110/2011sp/lectures/lec26typeinference/typeinfe
rence.htm
http://stackoverflow.com/questions/8017172/whyisocamlsnotpolymorphic
http://stackoverflow.com/questions/6860407/functionoverloadinginocaml
http://www.ffconsultancy.com/languages/ray_tracer/comparison.html