Vous êtes sur la page 1sur 22

UNIVERSIDADNACIONALDELAPATAGONIASANJUANBOSCO

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

Vous aimerez peut-être aussi