SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Expresando Hypermedia en Programacion Funcional
 Ignacio Gallego Sagastume            Daniel H. Marcos           Pablo E. Mart nez Lopez
                                       Walter A. Risi

            LIFIA, Departamento de Informatica, Universidad Nacional de La Plata.
           C.C.11, Correo Central, 1900, La Plata, Buenos Aires, Republica Argentina.
                E-mail: fnick,daniel,fidel,walterg@lifia.info.unlp.edu.ar
                         URL: http://www-lifia.info.unlp.edu.ar/


                                          Abstract
      En este art culo se presentan un conjunto de herramientas constru das sobre el lenguaje
  funcional lazy Haskell para describir documentos hypermediales. El trabajo consiste en el
  dise~o e implementacion de un conjunto de funciones y tipos que permitan describir los
       n
  elementos basicos de un documento hypermedial (nodos, links, componentes multimediales
  y la interaccion entre ellos). La construccion de los documentos de hypermedia se realiza
  utilizando una metodolog a composicional, en la que componentes de hypermedia complejos se
  construyen combinando repetidamente otros mas simples. Esta metodolog a puede utilizarse
  tambien para crear componentes genericos y reusables. Otro aspecto interesante es que los
  documentos descritos con estas herramientas no dependen de construcciones espec cas de
  una plataforma de hypermedia en particular. Consecuentemente, los documentos constru dos
  de esta forma pueden ser trasladados luego a diferentes plataformas de hypermedia, como
  HTML o Ayuda de Windows, sin necesidad de efectuar modi caciones.
Expresando Hypermedia en Programacion Funcional
1 Introduccion
No hay duda de que los sistemas hypermediales Nie95] han sufrido gran expansion en los ultimos
a~os. Existen multiples razones que justi can este desarrollo, aunque probablemente la mas
 n
importante es que estos sistemas trabajan en forma interactiva, brindando un formato muy
amigable de presentar informacion al usuario. Esto, unido con el abaratamiento de los medios
necesarios para soportar facilidades multimediales e hypermediales (lectores de CD-ROMs, ter-
minales gra cas, etc.), ha conducido a que cada vez sean mas los que se inclinan a utilizar medios
hypermediales en vez de los tradicionales (medios impresos por lo general). Por otro lado, la
expansion de la WWW ha generado un campo muy amplio para el desarrollo de aplicaciones
hypermediales distribu das sobre redes en gran escala.
    La programacion funcional BW88] ofrece un gran numero de ventajas a los programadores,
por ejemplo un alto nivel de abstraccion y una gran capacidad de expresion. Estas caracter sticas
surgen de los poderosos mecanismos de abstraccion presentes en los lenguajes funcionales (fun-
ciones de alto orden, polimor smo, etc.). Estas ventajas se re ejan en un tiempo de desarrollo
de programas menor que el requerido habitualmente con lenguajes imperativos, resultando ser
ademas el codigo mas facil de entender, mantener y reusar.
    En este art culo se presentan un conjunto de herramientas constru das sobre el lenguaje
funcional lazy Haskell PH+ 96] para describir documentos hypermediales. El trabajo consiste
en el dise~o e implementacion de un conjunto de funciones y tipos que permiten describir los
           n
elementos basicos de un documento hypermedial (nodos, links, componentes multimediales y la
interaccion entre ellos).
    El trabajo resulta novedoso pues utiliza el paradigma funcional para describir hypermedias;
estas tareas han estado muy distanciadas en el ambiente informatico de Latinoamerica, y es la
intencion principal de este art culo acercar ambas disciplinas. Ademas, otros aspectos atractivos
del trabajo son la separacion que se obtiene entre la descripcion semantica de un documento
hypermedial y su representacion visual en una plataforma determinada, y la facilidad de de nir
componentes de hypermedia genericos reusables. Es importante destacar la utilizacion de una
metodolog a composicional, en la que componentes de hypermedia complejos pueden constru rse
combinando componentes mas simples. Finalmente, el trabajo es interesante como aplicacion de
tecnicas de dise~o de programacion funcional; ejemplos de las mismas son el uso de combinadores
                 n
y transformadores.
    El art culo comienza con una breve introduccion a los conceptos basicos de hypermedia que
se utilizan a lo largo del trabajo. En la Secc. 3 se presenta el dise~o general de la aplicacion. La
                                                                     n
Secc. 4 describe como se realiza la traduccion de un documento descrito con las herramientas
de la seccion anterior a una plataforma de hypermedia espec ca. En la Secc. 5 se presentan
algunos ejemplos, y en la Secc. 6 se explican los detalles de implementacion. Finalmente, en la
Secc. 7 se mencionan algunos trabajos relacionados.

2 Conceptos basicos sobre hypermedia
Puede de nirse hypermedia como la conjuncion de multimedia e hypertexto. Se dice que una
aplicacion es multimedial cuando reune dentro de ella varios medios, como texto, imagenes,
video, audio, etc. Por otra parte, la manera mas simple de de nir hypertexto es haciendo una
comparacion con los medios de informacion tradicionales, como libros y revistas. En un formato
tradicional, la informacion se presenta en forma secuencial, es decir, existe una secuencia que
de ne el orden en que la informacion debe ser considerada. En un hypertexto, por otro lado, el
texto se agrupa en unidades de informacion relacionada; estas unidades son llamadas nodos, y
a su vez estos pueden referenciarse unos a otros. Es importante notar que el usuario no accede
a la informacion en forma secuencial, sino que lo hace siguiendo las referencias a otros nodos.
    Las referencias que conectan dos nodos (que pueden ser en ambos sentidos a la vez) se llaman
links o hyperlinks. El nodo del cual parte el link se denomina origen del link. El nodo o parte
del nodo al cual se llega a traves de la activacion de un link, se denomina destino del link.
    Los hyperlinks estan asociados con partes espec cas de los nodos que conectan, como por
ejemplo una palabra o una imagen. Estas partes de los nodos asociadas con links se denominan
anchors (anclas), y determinan, o bien el origen de un link (una parte del nodo que permite
activar el link), o bien el destino (una parte particular del nodo destino a la que se llega a traves
de la activacion del link). Los anchors del primer grupo se denominan anchors de origen, y los
del segundo grupo anchors de destino.
    Muchas veces se hace distincion entre distintos tipos de links. Por ejemplo, se suele diferenciar
entre links que hacen referencia a cierta parte dentro del mismo nodo, los que lo hacen a otro nodo
dentro del mismo documento, y los que referencian a un nodo perteneciente a otro documento
hypermedial.
    Ejemplos de sistemas hypermediales son la World Wide Web, Hyper-G y la Ayuda de Win-
dows.

3 Descripcion del Trabajo
El trabajo consiste en un conjunto de abstracciones que representan los elementos de hypermedia
existentes en la mayor a de los sistemas actuales. A continuacion se presenta la formalizacion
de estos elementos dentro de este trabajo, junto con las abstracciones que los representan.

3.1 Nodos
Los nodos son las unidades basicas de informacion que constituyen los sistemas hypermediales.
Un nodo esta constitu do internamente por bloques de informacion expresados en un medio
particular (imagen, texto, etc.). Ademas de dichos bloques, los nodos poseen estructuras cuya
funcionalidad es la de permitir conectarse a otros nodos.
   En este modelo la abstraccion que representa este concepto es el tipo Node. La forma de
construir un nodo es a traves de la funcion de construccion node.
   node :: NodeId -> HG -> Node


Un nodo esta compuesto por un identi cador de nodo, NodeId, y un componente, HG (Hypergad-
get). El NodeId es un elemento que permite identi car un vocamente a un nodo (ver Secc. 3.5).
Los Hypergadgets son los componentes mediante los cuales se constituye internamente un nodo
(ver Secc. 3.3).
    Existen funciones que denominamos transformadores de nodos que al aplicarse a un nodo, le
agregan alguna caracter stica que lo afecta en un aspecto particular. Algunas transformaciones
t picas son, por ejemplo:
   defaultTextColor, backgroundColor :: Node -> Color -> Node


La transformacion defaultTextColor determina que el nodo transformado tendra por color
de texto por defecto el que se pasa como parametro. En forma similar, la transformacion
backgroundColor determina el color de fondo del nodo al cual se aplica.


3.2 Hyperlinks
Los hyperlinks son los elementos que permiten relacionar varios nodos entre s . Los links junto
con los nodos son los elementos que estructuran los sistemas hypermediales; en particular, a
partir de la existencia de los links surge la actividad denominada navegacion", la cual hace
referencia al modo en que el usuario accede a la informacion dentro del sistema hypermedial.
    En este trabajo se distingue entre los links que conectan nodos que pertenecen a un mismo
documento hypermedial y los que conectan nodos pertenecientes a distintos documentos; esta
distincion pretende marcar diferencias tematicas o conceptuales antes que de ubicacion f sica. Se
denomina al primer grupo Near Hyperlinks y al segundo grupo Far Hyperlinks. Los tipos que los
representan son NearHL y FarHL respectivamente. Existe ademas el tipo general HL (hyperlink),
cuyos elementos representan hyperlinks, independientemente de que sean near o far.
    La clase Hyperlink agrupa a los tipos que representan hyperlinks. Los tipos que pertenecen
a esta clase son HL, NearHL y FarHL (para mas detalles ver la Secc. 6.1).
    El destino de un link puede ser o bien un nodo en su totalidad, o bien una parte espec ca
de un nodo (un parrafo de texto determinado, una imagen, etc.). Ademas, el nodo destino y el
nodo origen pueden ser el mismo nodo, con lo cual un nodo podr a tener un link a otra parte
de s mismo. Por lo tanto, surge la necesidad de tener una manera de especi car el destino
de un link. En este trabajo se considerara que un link contiene un destino, representado por
la abstraccion HLDestiny (Hyperlink Destiny), la cual contendra la informacion requerida para
identi car al nodo destino, o a la parte del mismo a la que se quiere llegar.
    Se tienen funciones de construccion para hyperlinks:
   nearHL :: HyperlinkDestiny a => a -> NearHL
   farHL    :: HyperlinkDestiny a => a -> FarHL

La clase HyperlinkDestiny agrupa a aquellos tipos cuyos elementos pueden ser utilizados para
denotar el destino de un hyperlink. Los elementos de tipo Node o NodeId pertenecen a esta clase,
ya que pueden utilizarse para indicar que ese nodo es el destino del hyperlink. El mecanismo
con el cual se construyen los Hyperlink Destinys se vera con mas profundidad en la Secc. 6.1.1.

3.3 Hypergadgets
Un nodo esta compuesto internamente por componentes que de nen su estructura. Ejemplos
de estos componentes son bloques de texto, imagenes, listas, anchors, etc. En este trabajo
se denomina Hypergadget a un componente como los mencionados. Se hace diferencia entre
los Hypergadgets puramente visuales, llamados Dumb Hypergadgets, y aquellos que ademas son
anchors de origen o destino de un link, denominados Anchor Hypergadgets.
    El tipo de los Dumb Hypergadgets es DumbHG, y el tipo de los Anchor Hypergadgets es
AnchorHG. Existe ademas el tipo general HG, que representa un Hypergadget, independientemente
de que sea un Dumb Hypergadget o Anchor Hypergadget.
    Existen Hypergadgets atomicos que representan elementos simples, como un bloque de texto,
una imagen, una lista, etc. Componentes como los mencionados pueden construirse a partir de
las funciones correspondientes.
   txtDumbHG          :: String -> TxtDumbHG
   imgDumbHG          :: ImgSource -> ImgDumbHG
   itemListDumbHG :: Hypergadget h =>            h] -> ItemListDumbHG

Otros hypergadgets atomicos son los anchors. Existen anchors de origen (aquellos de los que
parte un link) y anchors de destino (aquellos a los que se llega a partir de un link). El tipo de los
primeros es OrgAnchorHG y el tipo de los segundos es DstAnchorHG. El tipo general AnchorHG
representa un anchor, independientemente de que sea de origen o destino. Los anchors tienen
ademas una parte visual. Las funciones de construccion correspondientes son orgAnchorHG y
dstAnchorHG.

orgAnchorHG :: (DumbHypergadget d, Hyperlink h) => d -> h -> OrgAnchorHG
dstAnchorHG ::      Hypergadget h => DstAnchorId -> h -> DstAnchorHG

   Un anchor de origen se construye a partir de un Dumb Hypergadget (elemento de un tipo per-
teneciente a la clase DumbHypergadget) y de un link (elemento de un tipo de la clase Hyperlink).
El Dumb Hypergadget constituye la parte visual del anchor, y el link es aquel del cual el anchor
es origen.
    Un anchor de destino se construye a partir de un Hypergadget (elemento de un tipo perte-
neciente a la clase Hypergadget) y de un identi cador de anchor destino, DstAnchorId, que
identi ca un vocamente al anchor de destino (ver Secc. 3.5).
    Los elementos de los tipos DstAnchorHG y DstAnchorId pueden ser utilizados para indicar
el destino de un link, por lo tanto, pertenecen a la clase HyperlinkDestiny.
    La clase de tipo Hypergadget agrupa a los tipos que denotan Hypergadgets. Ademas, las
clases DumbHyperGadget y AnchorHypergadget, subclases de la anterior, agrupan a los tipos
que representan Dumb Hypergadgets y Anchor Hypergadgets, respectivamente (ver Secc. 6.2
para detalles de implementacion).
    Los tipos DumbHG, TxtDumbHG, ImgDumbHG y ItemListHG son instancias tanto de la clase
Hypergadget como DumbHypergadget. De la misma manera, los tipos AnchorHG, OrgAnchorHG
y DstAnchorHG son instancias tanto de la clase Hypergadget como AnchorHypergadget. Otra
instancia de la clase Hypergadget es el tipo HG.
    Se presenta a continuacion un peque~o ejemplo en donde se utilizan las funciones de cons-
                                          n
truccion anteriormente vistas. Lo que se de ne es un anchor de origen, toAnchor, y un anchor
destino, anchorDst, el cual representa una lista de elementos. La expresion thisNodeId sim-
plemente se corresponde al identi cador del nodo al que se esta estructurando.
   -- Definicion de Dumb Hypergadgets
   item1       = txtDumbHG "Item1"
   item2       = txtDumbHG "Item2"
   lista       = itemListDumbHG      item1, item2]


   -- Definicion de hyperlinks y Anchor Hypergadgets
   anchorDst = dstAnchorHG (dstAnchorId "anchorDst" thisNodeId) lista
   nearLink    = nearHL anchorDst
   toAnchor    = orgAnchorHG (txtDumbHG "Observar la lista ...") nearLink


3.3.1 Combinacion y transformacion de Hypergadgets
Un combinador de Hypergadgets es una funcion que toma dos o mas Hypergadgets, devolviendo
uno mas complejo que resulta de la combinacion de los mismos. Dicha combinacion se hace
siguiendo reglas de layout, y algunos combinadores son, por ejemplo:
   aboveOf, belowOf,
   leftOf, rightOf,
   next :: (Hypergadget a, Hypergadget b) => a -> b -> HG
La combinacion aboveOf, por ejemplo, toma dos Hypergadgets, y retorna uno nuevo que resulta
de ubicar el primero arriba del segundo. Los demas combinadores se comportan de manera
analoga.
   Los operadores (/=), (=/), (<=<), (>=>) y (+++), son equivalentes a aboveOf, belowOf,
leftOf, rightOf y next, respectivamente. La eleccion de ordenes de precedencia adecuados
reduce el uso de los parentesis necesarios al escribir expresiones usando estos combinadores.
   infixr 6 <=<, >=>
   infixr 5 /=, =/
   infixr 4 +++

   Algunos Dumb Hypergadgets interesantes que se utilizan junto con los combinadores de layout
mencionados son hSpace y vSpace.
   hSpace, vSpace :: Int -> DumbHG

Las funciones hSpace y vSpace sirven para dejar espacios (horizontales y verticales, respecti-
vamente) de una cierta cantidad de pixels. Estos componentes se utilizan exclusivamente por
razones de layout.
   Otro Hypergadget importante es el Hypergadget nulo. Este es el elemento neutro para
cualquiera de las combinaciones vistas anteriormente. La funcion nullHG permite crear un
elemento de este tipo.
   nullHG :: DumbHG

    Un transformador de Hypergadgets es una funcion que al aplicarse a un Hypergadget le agrega
alguna caracter stica que lo afecta en algun aspecto particular. Algunas de las transformaciones
t picas son:
   txtColor                           :: Color -> TxtDumbHG -> TxtDumbHG
   justifyL, justifyC, justifyR :: HG -> HG

La transformacion txtColor toma un Hypergadget de texto, TxtDumbHG, y le asigna un color
particular. Las transformaciones justifyC, justifyR y justifyL hacen que el Hypergadget
transformado este alineado al centro, derecha o izquierda, respectivamente.
    Un transformador interesante es txtWithAnchors, el cual provee una forma practica de
insertar anchors de origen en un componente de texto. Esta funcion toma dos argumentos: una
lista de asociaciones entre Strings e hyperlinks y un Hypergadget de texto. El resultado de
aplicar esta funcion es un componente de tipo HG, en donde los componentes de texto que guran
en la lista son reemplazados por anchors de origen con los correspondientes links.
   txtWithAnchors :: Hyperlink h =>         (String, h)] -> TxtDumbHG -> HG

La utilizacion de la funcion anterior evita el tener que de nir los anchors en forma separada, y
luego combinarlos mediante el operador (+++).
3.4 Documentos hypermediales
Un documento hypermedial es una coleccion de nodos relacionados entre s por links. En este
trabajo la abstraccion que representa este concepto es el tipo HD (hypermedia document), y la
forma de construir un documento es a traves de la funcion de construccion hd.
   hd :: HDId ->     Node] -> HD


Un documento hypermedial esta compuesto por un identi cador de documento, HDId, y un con-
junto de nodos. Un HDId es un elemento que permite identi car un vocamente a un documento
hypermedial (ver Secc. 3.5).

3.5 Identi cadores
Algunos componentes requieren ser identi cados un vocamente dentro de la hypermedia que se
esta construyendo. Para esto se utilizan estructuras denominadas identi cadores.
    Un identi cador de tipo NodeId permite identi car en forma un voca a un nodo. Un elemento
de este tipo se construye mediante la funcion nodeId.
   nodeId :: String -> HDId -> NodeId


El String con el cual se construye el NodeId es un nombre que debe ser unico para cada nodo
en un mismo documento, pudiendose repetir en nodos de distintos documentos hypermediales.
   El identi cador de anchor de destino esta representado por el tipo DstAnchorId y los ele-
mentos de este tipo se construyen mediante la funcion dstAnchorId.
   dstAnchorId :: String -> NodeId -> DstAnchorId


El String con el cual se construye el DstAnchorId debe ser unico dentro del nodo en donde se
ubica el DstAnchor en cuestion.
    El tipo HDId representa al identi cador de documento hypermedial y los elementos de este
tipo se construyen mediante la funcion hdId.
   hdId :: String -> HDId


El String con el cual se construye el HDId debe ser unico de ese documento.

4 Portabilidad a diferentes plataformas
Las construcciones provistas en la Secc. 3 permiten expresar la estructura y la apariencia de un
documento hypermedial sin hacer uso de caracter sticas espec cas de una plataforma de hyper-
media particular. De esta forma, un documento expresado con las construcciones ya presentadas
puede ser trasladado sin modi caciones a cualquier plataforma de hypermedia (HTML, Ayuda
de Windows, etc.), utilizando funciones de traduccion.
    Las funciones de traduccion a una plataforma espec ca se proveen en modulos que el usuario
importa dependiendo de la plataforma que elija. El modulo de una plataforma no solo provee
las funciones de traduccion, sino tambien estructuras y funciones que permiten incorporar ca-
racter sticas propias de la misma; estas caracter sticas no estan inclu das en el modelo base por
ser muy espec cas de una plataforma particular.
    Supongase que se decide traducir el documento a la plataforma HTML. Lo primero que debe
hacerse es importar el modulo de la plataforma HTML.
   import HTML

   El modulo HTML provee la funcion de traduccion renderHD. La misma convierte un documento
hypermedial constru do con las estructuras vistas, a un conjunto de archivos HTML.
   type PageNames =      (NodeId, String)]


   renderHD :: HD -> PageNames -> IO ()

   La funcion renderHD toma un documento hypermedial y una lista de pares que asocia a
cada nodo un nombre de archivo. El resultado de evaluar la funcion es un conjunto de archivos
HTML. Notese que la funcion anterior utiliza entrada/salida monadica Wad95, GH95].
   Otra funcion de traduccion provista por el modulo HTML es renderHDs, que permite la tra-
duccion de varios documentos.
   renderHDs ::     (HD, PageNames)] -> IO ()

La funcion renderHDs es necesaria cuando se de nen documentos con hyperlinks entre s .
    El modulo HTML provee ademas funciones que permiten incorporar construcciones espec cas
de la plataforma HTML. Un ejemplo es el transformador de nodo backgroundImg.
   backgroundImg :: ImgSource -> Node -> Node

La funcion backgroundImg toma un elemento ImgSource (especi ca donde esta el archivo de
imagen) y un elemento Node, y devuelve un nodo que tiene como fondo a la imagen especi cada.
El tipo ImgSource es una construccion que permite especi car el archivo fuente de una imagen.
Cada plataforma provee una de nicion para este tipo, por ejemplo, en la plataforma HTML un
elemento del tipo ImgSource corresponde a un URL.
   type ImgSource = URL

El tipo URL es espec co de la plataforma HTML. Un elemento de este tipo puede constru rse
mediante la funcion url.
url :: String -> URL

El elemento de tipo String que recibe la funcion corresponde a un URL.

5 Ejemplos
A continuacion, se presentan tres ejemplos del uso de las estructuras descritas en este trabajo.
El primero muestra la forma de construir un documento hypermedial sencillo con las estructuras
vistas; el segundo ejemplo ilustra como las herramientas provistas son utiles para de nir nuevos
componentes reusables a partir de los existentes; en el tercer y ultimo ejemplo, se ejempli ca el
uso de hyperlinks para conectar ambos documentos.
    Notese que en estos ejemplos se utiliza HTML como la plataforma destino, por lo cual se
utilizan algunas construcciones propias del modulo espec co de la plataforma HTML.

5.1 Un Documento Simple
Supongase que se desea escribir una pagina de WWW que brinde informacion basica sobre la
2da Conferencia Latinoamericana de Programacion Funcional. Con esta aplicacion, se modelara
como un documento hypermedial con un unico nodo.
    Se comienza de niendo un componente de texto que sera el t tulo de la pagina. Se desea
que el t tulo se destaque del resto del texto; para esto, se utiliza la transformacion txtLevel
con el parametro H1, lo cual indica que se trata de un t tulo de importancia. Aparte de esta
transformacion, se utiliza txtColor, para que el texto resultante se muestre en color rojo, y la
transformacion justifyL para que el componente este alineado a la izquierda.
   title str = justifyL $ txtLevel H1 $ txtColor Red $ txtDumbHG str

El operador $ es simplemente aplicacion de funciones; se lo utiliza en el ejemplo para evitar el
uso excesivo de parentesis.
   El siguiente paso consiste en de nir un subt tulo.
   subTitle str = justifyL $ txtLevel H2 $ txtColor Red $ txtDumbHG str

Observese que en este caso el transformador txtLevel lleva como parametro adicional H2, lo
cual indica que el componente de texto en cuestion es un t tulo de menor importancia que el
anterior.
    La siguiente tarea consiste en escribir un parrafo de introduccion. Ademas, se desea que el
dicho parrafo contenga un hyperlink a la pagina de la primera edicion de la conferencia, para lo
cual habra que de nir dicho link e insertar un anchor en que lo active.
   clapfIntro = txtWithAnchors         ('primera edicion', toFirstEd)] $ txtDumbHG
                       "Estamos orgullosos de anunciar la organizacion de la 2da
Conferencia Latinoamericana de Programacion Funcional. El
                       exito de la primera edicion nos alienta a continuar
                       trabajando para lograr las metas que nos guiaron: "

El link toFirstEd se de ne como sigue:
   toFirstEd = farHL $ url
                     "http://www-lifia.info.unlp.edu.ar/~lambda/first/spanish"

El hyperlink anterior es un FarHL ya que sale del documento corriente. El destino del link
se especi ca mediante un URL (que puede incluirse usando la funcion url, espec ca de la
plataforma HTML) ya que el documento en cuestion no esta de nido dentro de esta aplicacion,
sino que existe como documento HTML independiente.
    Para completar el documento, se desea crear una lista de tems con las razones principales
que motivan la realizacion de la conferencia. Se utiliza para esto el componente itemListHG.
aimList = itemListDumbHG      item1, item2, item3]
item1    = txtDumbHG "Promover el uso de la programacion funcional en ambientes
                        academicos y no academicos."
item2    = txtDumbHG "Promover el acercamiento entre los investigadores y el
                        intercambio de conocimientos y experiencias."
item3    = txtDumbHG "Dar a conocer las experiencias de aplicacion practica y
                        las posibilidades que ofrece la programacion funcional."

   De nidos todos los componentes, solo resta combinarlos todos en el cuerpo del nodo.
   clapfBody =
        title "2da Conferencia Latinoamericana de Programacion Funcional" /=
        subtitle "3 y 4 de Octubre de 1997, La Plata, Argentina"                     /=
        divisionLine                                                                 /=
        clapfIntro                                                                   /=
        aimList                                                                      /=
        divisionLine

El componente divisionLine es una l nea divisoria, que se incluye para mejorar la presentacion
del documento.
    El paso restante es de nir un nodo con el cuerpo, clapfBody, y un documento hypermedial
que contenga a ese nodo.
   clapfNodeId = nodeId "CLapF Home Page" clapfDocId
   clapfNode      = backgroundImg (url "fondo1.gif") $ defaultTxtColor Black $
                       node clapfNodeId clapfBody
clapfDocId      = hdId "Home Page De CLaPF"
   clapfDoc        = hd clapfDocId       clapfNode]


Notese que al nodo de nido se le aplican dos transformaciones. La transformacion backgroundImg
(espec ca de la plataforma HTML) determina que se utilizara el archivo fondo1.gif como
gra co de fondo para la pagina. La transformacion defaultTxtColor determina que el color de
texto por defecto sera negro.
    Se tiene entonces un documento simple que cuenta con un unico nodo. Supongase que se
desea transladar este documento a plataforma HTML; se utiliza para esto la funcion renderHD
del modulo HTML, de la siguiente manera:
   clapfAssocList =        (clapfNodeId, "clapf.htm")]
   main                = renderHD clapfDoc clapfAssocList


La funcion main anterior genera una pagina de WWW, cuyo codigo HTML reside en el archivo
clapf.htm. La pagina puede verse en la Fig. 1. 1




     Figure 1: Pagina de la 2da Conferencia Latinoamericana de Programacion Funcional.

  1 La visualizacion de las paginas HTML se realiza utilizando Netscape Navigator Version 3.01. Copyright
1994-1996 Netscape Communications Corporation.
5.2 De niendo Nuevos Componentes
La motivacion del segundo ejemplo es de nir un documento con datos personales de dos in-
vestigadores. Por simplicidad, los datos que se consideran son nombre, fecha de nacimiento y
posicion dentro de la universidad. Ademas, se desea que estos datos se provean junto a una foto
de la persona en cuestion.
    Para dar una presentacion estandar de los datos de las personas, y para evitar escribir codigo
innecesario, se crea un componente reusable personalFile.
   personalFile :: String -> String -> String -> ImgDumbHG -> OrgAnchorHG ->
                       String -> DstAnchorHG
   personalFile name date position image back id
                     = dstAnchorHG id $ justifyC $
                       (txtSize S6 $ txtColor Maroon $ txtDumbHG name) /=
                       vSpace 20                                                  /=
                       image <=< dataList                                         /=
                       back                                                       /=
                       divisionLine
                       where
                           item s1 s2 = (txtColor Green $ txtDumbHG s1) +++
                                           (txtDumbHG s2)
                           dataList     = itemListDumbHG
                                                item "Birth Date: " date,
                                                item "Position: " position]


El componente personalFile es un componente complejo, constru do a partir de otros mas
simples; ademas, es un componente generico que se instancia a partir de los datos de una
persona en particular.
   Ademas de cada una de las chas personales, se desea tener un ndice al principio de la
pagina. Para esto, se construye el componente generico makeIndex.
   makeIndex      :: Hyperlink l =>       (String, ImgDumbHG, l)] -> HG
   makeIndex xs = justifyC $ foldr (<=<) nullHG (map build xs)
                      where build (n,i,l) = justifyC $ (orgAnchorHG i l) /=
                                                               (txtSize S4 $ txtDumbHG n)


La funcion makeIndex recibe una lista de tuplas, formadas por un String, un ImgDumbHG, y un
elemento de la clase Hyperlink, que son el nombre, la imagen y el link a la cha de esa persona,
respectivamente. El resultado de la aplicacion de la funcion es un componente complejo, en
el que la imagen de una persona es anchor a su correspondiente cha; ademas, debajo de cada
imagen se coloca un componente de texto TxtDumbHG que corresponde al nombre de esa persona.
A continuacion puede verse el codigo que describe el documento completo haciendo uso de
los componentes genericos personalFile y makeIndex.
   import HTML       -- Modulo de la plataforma HTML.
   import MAIN       -- Modulo principal.
   import NEWC       -- Modulo con los componentes personalFile y makeIndex.


   -- Definicion del titulo y el subtitulo.
   title str       = justifyC $ txtLevel H1 $ txtColor Blue $ txtDumbHG str
   titleId         = dstAnchorId "Title" thisNodeId
   pageTitle str = dstAnchorHG titleId
                                   (title "Functional Programming Researchers")


   -- Definicion del indice y las secciones del documento.
   imagePEML      = imgDumbHG (url "peml.jpg")
   imageMAC       = imgDumbHG (url "mac.jpg")
   namePEML       = "Pablo E. Martinez Lopez"
   nameMAC        = "Marcelo A. Cardos"
   pageIndex      = makeIndex    (namePEML, imagePEML, toSection1),
                                 (nameMAC, imageMAC, toSection2)]
   section1       = personalFile namePEML "20/3/1968" "Researcher"
                                   imagePEML backToIndex
                                   (dstAnchorId "PEML" thisNodeId)
   section2       = personalFile nameMAC "4/4/1966" "Researcher"
                                   imageMAC backToIndex
                                   (dstAnchorId "MAC" thisNodeId)
   backToIndex    = justifyC $ orgAnchorHG (txtDumbHG "Back to Index") toIndex


   -- Definicion del cuerpo del documento.
   pageBody       = pageTitle      /=
                    pageIndex      /=
                    divisionLine /=
                    section1       /=
                    section2


   -- Definicion de hyperlinks.
   toSection1     = nearHL section1
   toSection2     = nearHL section2
   toIndex        = nearHL pageTitle
-- Definicion del nodo.
thisNodeId    = nodeId "Second Example" thisDocId
thisNode      = backgroundImg (url "fondo2.gif") $ defaultTxtColor Black $
                    node thisNodeId pageBody


-- Definicion del documento.
thisDocId     = hdId "Second Example"
thisDoc       = hd thisDocId     thisNode]


-- Traduccion a la plataforma HTML.
assocList     =   (thisNodeId, "ejemplo2.htm")]
main          = renderHD thisDoc assocList



El documento, trasladado a plataforma HTML, puede verse en la Fig. 2.




             Figure 2: Pagina de nida utilizando componentes genericos.
5.3 Conectando los ejemplos anteriores
Supongase ahora que se desea que el documento generado en el segundo ejemplo contenga un link
al documento que se construyo en el primer ejemplo. Lo primero que debe hacerse es importar
la de nicion del primer documento al archivo del segundo.
   import CLAPF


    El siguiente paso consiste en crear el hyperlink. Como se trata de documentos diferentes, el
link a construir sera de tipo FarHL (Far Hyperlink).
   linkToCLaPF = farHL clapfNodeId


    Una vez de nido el hyperlink hay que inclu rlo en el cuerpo del documento mediante el
correspondiente anchor, modi cando la de nicion de pageBody del ejemplo de la Secc. 5.2.
   anchorToCLaPF = justifyC $
                       orgAnchorHG (txtDumbHG "Go to ClaPF page") linkToCLaPF
   pageBody         = pageTitle         /=
                       pageIndex        /=
                       divisionLine     /=
                       section1         /=
                       section2         /=
                       anchorToCLaPF


  Una vez inclu do en el cuerpo del documento, solo resta transladarlo a la plataforma HTML.
Como se tienen dos documentos, se utiliza la funcion renderHDs en vez de renderHD.
main = renderHDs     (clapfAssocList, clapfId),
                     (assocList, thisDocId)]


   La pagina de WWW resultante puede verse en la Fig. 3.

6 Implementacion
En esta seccion se explican los puntos importantes sobre la implementacion de algunas de las
abstracciones mencionadas. Uno de los puntos a destacar es la forma en que se utilizaron las
clases de tipos de Haskell para describir los conceptos de hyperlink e Hypergadget.
Figure 3: Extension del segundo ejemplo.

6.1 Implementacion de hyperlinks
Existen tres tipos que implementan el concepto de hyperlink dentro del trabajo. Estos tipos son
NearHL, FarHL y HL.
    Los tipos NearHL y FarHL representan los conceptos de Near Hyperlink y Far Hyperlink,
respectivamente.
   data NearHL = NearHL HLDestiny
   data FarHL     = FarHL    HLDestiny


El tipo HLDestiny se detalla en la Secc. 6.1.1.
    Un elemento del tipo HL encapsula, o bien a un elemento del tipo NearHL, o bien a uno del
tipo FarHL.
   data HL =      ANearHL NearHL
               | AFarHL FarHL


El tipo HL se utiliza junto con la clase Hyperlink para expresar links que pueden ser tanto near
como far.
    La clase Hyperlink agrupa a los tipos HL, NearHL y FarHL. Los elementos de estos tipos
pueden convertirse al tipo general HL.
class Hyperlink h where
       toHL :: h -> HL


El tipo HL y la clase Hyperlink son utilizados por funciones polimor cas que toman o devuelven
tanto Near Hyperlinks como Far Hyperlinks. Un ejemplo es la funcion orgAnchorHG, la cual
construye un anchor de origen.
   orgAnchorHG       :: (DumbHypergadget d, Hyperlink h) => d -> h -> OrgAnchorHG
   orgAnchorHG d h = OrgAnchorHG (toDumbHG d) (toHL h)


   La clase DumbHypergadget y la funcion toDumbHG se ven con detalle en la Secc. 6.2.

6.1.1 Hyperlink Destinys
El tipo HLDestiny (Hyperlink Destiny) describe el destino de un hyperlink.
   data HLDestiny =       HLNodeDestiny NodeId
                        | HLAnchorDestiny DstAnchorId
                        | APSHLDestiny PSHLDestiny


   El destino de un hyperlink puede ser un nodo, un anchor, o puede estar expresado por una
construccion espec ca de alguna plataforma de hypermedia particular (por ejemplo, un URL
en HTML). El tipo PSHLDestiny esta implementado en el modulo de cada plataforma, y en
particular en el modulo HTML esta implementado como un sinonimo del tipo URL.
   La clase HyperlinkDestiny agrupa a los tipos que pueden usarse para construir el destino
de un hyperlink, y sus instancias son Node, NodeId, DstAnchor, DstAnchorId, y PSHLDestiny.
Los elementos de los tipos mencionados pueden convertirse al tipo HLDestiny.
   class HyperlinkDestiny d where
       toHLDestiny :: d -> HLDestiny


Un ejemplo t pico del uso de esta clase es la funcion de construccion de Near Hyperlinks.
   nearHL    :: HyperLinkDestiny d => d -> NearHL
   nearHL d = NearHL (toHLDestiny d)


6.2 Implementacion de Hypergadgets
El tipo mas importante que representa a los Hypergadgets es el tipo HG.
   data HG =      ADumbHG DumbHG
               | AnAnchorHG AnchorHG
               | AboveOf HG HG
| LeftOf HG HG
                | JustifyL HG
                | JustifyC HG
                | JustifyR HG
                | NullHG

   HG es el tipo de los Hypergadgets en forma general. Un elemento de este tipo puede encapsular
a elementos de los tipos DumbHG y AnchorHG, y tambien a combinaciones y transformaciones de
Hypergadgets.
    La clase Hypergadget agrupa a los tipos que representan a los Hypergadgets. Los elementos
de los tipos pertenecientes a esta clase pueden convertirse al tipo general HG.
   class Hypergadget h where
       toHG :: h -> HG

Ejemplos de uso de esta clase son los combinadores y transformadores de Hypergadgets.
   aboveOf       :: (Hypergadget a, Hypergadget b) => a -> b -> HG
   above h1 h2 = (toHG h1) `AboveOf` (toHG h2)


   justifyC      :: Hypergadget h => h -> HG
   justifyC h     = JustifyC (toHG h)

   De manera similar DumbHG es el tipo mas general para expresar Dumb Hypergadgets.
   data DumbHG =       ATxtDumbHG TxtDumbHG
                    | AnImgDumbHG ImgDumbHG
                    | AnItemListDumbHG ItemListDumbHG
                    | DivisionLine
                    | HSpacer Int
                    | VSpacer Int

   La clase   DumbHypergadget   agrupa a los tipos que denotan Dumb Hypergadgets, e incluye
a TxtDumbHG, ImgDumbHG y ItemListDumbHG. Los elementos de los mencionados tipos pueden
convertirse al tipo general DumbHG. Esta clase es subclase de Hypergadget, y por lo tanto sus
instancias deben permitir tambien la conversion al tipo HG.
   class Hypergadget h => DumbHypergadget h where
       toDumbHG :: h -> DumbHG

Un ejemplo del uso de esta clase es la funcion orgAnchorHG, vista en un ejemplo anterior (ver
Secc. 6.1).
   El tipo mas general de los Anchor Hypergadgets es AnchorHG.
data AnchorHG =        AnOrgAnchorHG OrgAnchorHG
                       | ADstAnchorHG      DstAnchorHG

La clase AnchorHypergadget agrupa a los tipos que denotan Anchor Hypergadgets, e incluye a
OrgAnchorHG y DstAnchorHG. Los elementos de los mencionados tipos pueden convertirse al tipo
general AnchorHG. Esta clase es subclase de Hypergadget, y por lo tanto sus instancias deben
permitir tambien la conversion al tipo HG.
   class Hypergadget h => AnchorHypergadget h where
       toAnchorHG :: h -> AnchorHG

Un ejemplo del uso de esta clase se da en la implementacion de la funcion toHG para el tipo
DstAnchorHG.

   instance Hypergadget DstAnchorHG where
       toHG h = AnAnchorHG (toAnchorHG h)



7 Trabajos relacionados
La utilizacion de una metodolog a composicional para construir estructuras mas complejas a
partir de estructuras mas simples no es nueva, y fue utilizada entre otros en Fok95] para parsers
funcionales, en Hud96] para expresar composiciones musicales de forma declarativa, en FJ96]
y HC95] para construir interfaces gra cas en lenguajes funcionales y en FJ95] para expresar
gra cos. En particular, la forma en que se utilizan transformadores y combinadores para expresar
layout y detalles de presentacion visual de componentes multimediales, es muy similar a la
utilizada en FJ96] y HC95] para manejar el layout y presentacion de componentes de GUIs y
la utilizada en FJ95] para de nir la disposicion f sica de componentes gra cos.
    La construccion de estructuras de hypermedia genericas y reusables y la creacion de estruc-
turas de hypermedia complejas a partir de la combinacion de otras mas simples ha sido utilizada,
entre otros por FNN96], desde la perspectiva del paradigma de orientacion a objetos.

8 Conclusiones
Se ha presentado una forma de construir documentos hypermediales mediante herramientas
constru das en un lenguaje funcional. Los bene cios usuales de la programacion funcional se
aplican a este trabajo: el alto nivel de abstraccion, la gran capacidad de expresion y la facilidad
de razonar sobre los programas, lograda gracias a la transparencia referencial.
    El trabajo propone tambien el uso de combinadores y transformadores para construir es-
tructuras complejas a partir de otras mas simples. Esta caracter stica, combinada con el uso de
funciones de alto orden, permite la creacion de componentes de hypermedia genericos altamente
reusables.
Por otro lado, las herramientas provistas permiten describir un documento hypermedial sin
utilizar construcciones espec cas de una plataforma de hypermedia particular, logrando que el
documento pueda ser trasladado sin modi caciones a distintas plataformas.
    Finalmente, otro punto a destacar de este trabajo es el acercamiento entre disciplinas habi-
tualmente muy distanciadas en el ambito informatico latinoamericano, como son la construccion
de sistemas de hypermedia y la programacion funcional. Revisiones posteriores de las versiones
preliminares de este trabajo por investigadores del area de hypermedia se han mostrado positivas
respecto de la utilizacion del paradigma funcional en esta area. Lo anterior es un incentivo para
continuar con el desarrollo de las ideas presentadas en este art culo.

References
BW88] Richard S. Bird and Philip Wadler. Introduction to Functional Programming. Prentice Hall, 1988.
FJ95] Sigborn Finne and Simon Peyton Jones. Pictures: A simple structured graphics model. In Glasgow
        Functional Programming Workshop, July 1995.
FJ96] Sigborn Finne and Simon Peyton Jones. Composing the user interface with Haggis. In John Launchbury,
        Erik Meijer, and Tim Sheard, editors, Advanced Functional Programming, LNCS 925, pages 1{37.
        Springer-Verlag, Aug 1996.
FNN96] S. Fra sse, J. Nanard, and M. Nanard. Generating hypermedia from speci cations by sketching multi-
        media templates. In Proceedings of the ACM Multimedia '96, 1996.
Fok95] Jeroen Fokker. Functional parsers. In Johan Jeuring and Erik Meijer, editors, Advanced Functional
        Programming, LNCS 925, pages 1{23. Springer-Verlag, May 1995.
GH95] Andrew D. Gordon and Kevin Hammond. Monadic I/O in Haskell 1.3. In Paul Hudak, editor, Proceed-
        ings of the Haskell Workshop, pages 50{69, La Jolla, California, June 1995.
HC95] Thomas Hallgren and Magnus Carlsson. Programming with fudgets. In Johan Jeuring and Erik Meijer,
        editors, Advanced Functional Programming, LNCS 925, pages 137{182. Springer-Verlag, May 1995.
Hud96] Paul Hudak. Haskore music tutorial. In John Launchbury, Erik Meijer, and Tim Sheard, editors,
        Advanced Functional Programming, LNCS 925, pages 38{67. Springer-Verlag, Aug 1996.
Nie95] Jakob Nielsen. Multimedia and Hypertext: The Internet and Beyond. Academic Press Inc., 1995.
PH+ 96] John Peterson, Kevin Hammond, et al. Report on the programming language Haskell, a non{strict,
        purely functional language. Version 1.3. Technical report, Yale University, May 1996.
Wad95] Philip Wadler. Monads for functional programming. In Johan Jeuring and Erik Meijer, editors, Advanced
        Functional Programming, LNCS 925. Springer-Verlag, May 1995.


Appendix
A continuacion, se listan las principales de niciones de tipos, clases de tipos y funciones del
trabajo.
     Nodos
        { Tipos
data NodeId          = ...
      data Node            = ...
      type NodeTitle = ...

  { Funciones de construccion
      nodeId :: String -> HDId -> NodeId
      node     :: Hypergadget a => NodeId -> a -> Node

  { Transformadores
      backgroundColor :: Color -> Node -> Node
      defaultTxtColor :: Color -> Node -> Node


Hyperlinks
  { Tipos
      data HL              = ...
      data NearHL          = ...
      data FarHL           = ...
      data HLDestiny = ...

  { Clases de tipos
      class Hyperlink a where ...
      class HyperlinkDestiny a where ...

  { Instancias de clases
      instance Hyperlink HL where ...
      instance Hyperlink NearHL where ...
      instance Hyperlink FarHL where ...
      instance HyperlinkDestiny NodeId where ...
      instance HyperlinkDestiny Node where ...
      instance HyperlinkDestiny PSHLDestiny where ...
      instance HyperlinkDestiny DstAnchorId where ...
      instance HyperlinkDestiny DstAnchorHG where ...

  { Funciones de construccion
      nearHL :: HyperlinkDestiny a => a -> NearHL
      farHL    :: HyperlinkDestiny a => a -> FarHL


Hypergadgets
  { Tipos
data HG                      = ...
    data DumbHG                  = ...
    data TxtDumbHG               = ...
    data ImgDumbHG               = ...
    data ItemListDumbHG = ...
    data TableDumbHG             = ...
    data TableRow                = ...
    data AnchorHG                = ...
    data OrgAnchorHG             = ...
    data DstAnchorId             = ...
    data DstAnchorHG             = ...

{ Clases de Tipos
    class Hypergadget a where ...
    class (Hypergadget a) => DumbHypergadget a where ...
    class (Hypergadget a) => AnchorHypergadget a where ...

{ Instancias de clases
    instance Hypergadget HG where ...
    instance Hypergadget DumbHG where ...
    instance Hypergadget TxtDumbHG where ...
    instance Hypergadget ImgDumbHG where ...
    instance Hypergadget ItemListDumbHG where ...
    instance Hypergadget TableDumbHG where ...
    instance Hypergadget AnchorHG where ...
    instance Hypergadget OrgAnchorHG where ...
    instance Hypergadget DstAnchorHG where ...
    instance DumbHypergadget DumbHG where ...
    instance DumbHypergadget TxtDumbHG where ...
    instance DumbHypergadget ImgDumbHG where ...
    instance DumbHypergadget ItemListDumbHG where ...
    instance DumbHypergadget TableDumbHG where ...
    instance AnchorHypergadget AnchorHG where ...
    instance AnchorHypergadget OrgAnchorHG where ...
    instance AnchorHypergadget DstAnchorHG where ...

{ Funciones de construccion
    nullHG               :: HG
    txtDumbHG            :: String -> TxtDumbHG
    imgDumbHG            :: ImgSource -> ImgDumbHG
itemListDumbHG :: Hypergadget a =>       a] -> ItemListDumbHG
      tableDumbHG      ::    TableRow] -> TableDumbHG
      tableRow         :: Hypergadget a =>     a] -> TableRow
      divisionLine     :: DumbHG
      hSpace, vSpace :: Int -> HG
      orgAnchorHG      :: (Hyperlink a, DumbHypergadget b) => b -> a -> OrgAnchorHG
      dstAnchorId      :: String -> NodeId -> DstAnchorId
      dstAnchorHG      :: Hypergadget a => DstAnchorId -> a -> DstAnchorHG

  { Combinadores
      (/=), aboveOf,
      (=/), belowOf,
      (>=>), rightOf,
      (<=<), leftOf,
      (+++), next      :: (Hypergadget a, Hypergadget b) => a -> b -> HG

  { Transformadores
      tableWidth       :: Int -> TableDumbHG -> TableDumbHG
      tableRowColor    :: Color -> TableRow -> TableRow
      txtWithAnchors :: Hyperlink a =>       (String, a)] -> TxtDumbHG -> HG
      txtLevel         :: TxtLevel -> TxtDumbHG -> TxtDumbHG
      txtColor         :: Color -> TxtDumbHG -> TxtDumbHG
      txtSize          :: TxtSizes -> TxtDumbHG -> TxtDumbHG
      justifyL,
      justifyC,
      justifyR         :: Hypergadget a => a -> HG


Documentos hypermediales
  { Tipos
      data HDId = ...
      data HD      = ...

  { Funciones de construccion
      hdId :: String -> HDId
      hd    :: HDId ->      Node] -> HD

Más contenido relacionado

Similar a Expresando Hypermedia en Programación Funcional (20)

hipertextos
hipertextoshipertextos
hipertextos
 
Multi,
Multi,Multi,
Multi,
 
87 estructura
87 estructura87 estructura
87 estructura
 
El hipertexto
El hipertextoEl hipertexto
El hipertexto
 
Hipertexto
HipertextoHipertexto
Hipertexto
 
Hipermedia
HipermediaHipermedia
Hipermedia
 
Diapositivas
Diapositivas Diapositivas
Diapositivas
 
Diapositivas 103
Diapositivas 103Diapositivas 103
Diapositivas 103
 
Diapositivas
DiapositivasDiapositivas
Diapositivas
 
Documento Web
Documento WebDocumento Web
Documento Web
 
Uso de Hipertexto y Multimedia
Uso de Hipertexto y MultimediaUso de Hipertexto y Multimedia
Uso de Hipertexto y Multimedia
 
Preguntas generadoras nucleo 2
Preguntas generadoras nucleo 2Preguntas generadoras nucleo 2
Preguntas generadoras nucleo 2
 
55237156 hi-per-media-web
55237156 hi-per-media-web55237156 hi-per-media-web
55237156 hi-per-media-web
 
Hipertexto e hipermedia
Hipertexto e hipermediaHipertexto e hipermedia
Hipertexto e hipermedia
 
Hiper
HiperHiper
Hiper
 
Redes conceptos 2
Redes conceptos 2Redes conceptos 2
Redes conceptos 2
 
#1
#1#1
#1
 
Hipertexto
HipertextoHipertexto
Hipertexto
 
Comunicación interactiva mt
Comunicación interactiva mtComunicación interactiva mt
Comunicación interactiva mt
 
Oo hdm powerpoint 1
Oo hdm powerpoint 1Oo hdm powerpoint 1
Oo hdm powerpoint 1
 

Más de Walter Ariel Risi

ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...
ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...
ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...Walter Ariel Risi
 
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...Walter Ariel Risi
 
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...Walter Ariel Risi
 
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;Walter Ariel Risi
 
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...Walter Ariel Risi
 
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?Walter Ariel Risi
 
SATURN 2011 Presentation by Walter Ariel Risi
SATURN 2011 Presentation by Walter Ariel RisiSATURN 2011 Presentation by Walter Ariel Risi
SATURN 2011 Presentation by Walter Ariel RisiWalter Ariel Risi
 
Software Guru Article (2006) "Enterprise Application Integration: more than j...
Software Guru Article (2006) "Enterprise Application Integration: more than j...Software Guru Article (2006) "Enterprise Application Integration: more than j...
Software Guru Article (2006) "Enterprise Application Integration: more than j...Walter Ariel Risi
 
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"Walter Ariel Risi
 
Article on International Journal of Mobile Communications "An Architectural P...
Article on International Journal of Mobile Communications "An Architectural P...Article on International Journal of Mobile Communications "An Architectural P...
Article on International Journal of Mobile Communications "An Architectural P...Walter Ariel Risi
 
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...Walter Ariel Risi
 
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.Walter Ariel Risi
 
IT Governance. Published in “Perspectiva” (Perspective) Magazine.
IT Governance. Published in “Perspectiva” (Perspective) Magazine.IT Governance. Published in “Perspectiva” (Perspective) Magazine.
IT Governance. Published in “Perspectiva” (Perspective) Magazine.Walter Ariel Risi
 
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...Business Process Management: From the Stand. Published in “Perspectiva” (Pers...
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...Walter Ariel Risi
 
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)Walter Ariel Risi
 
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008Walter Ariel Risi
 
Software Architecture Office Presentation by Walter Ariel Risi, 2006
Software Architecture Office Presentation by Walter Ariel Risi, 2006Software Architecture Office Presentation by Walter Ariel Risi, 2006
Software Architecture Office Presentation by Walter Ariel Risi, 2006Walter Ariel Risi
 
IBM Rational Day 2006, Presentation by Walter Ariel Risi
IBM Rational Day 2006, Presentation by Walter Ariel RisiIBM Rational Day 2006, Presentation by Walter Ariel Risi
IBM Rational Day 2006, Presentation by Walter Ariel RisiWalter Ariel Risi
 
IBM Governance & Compliance 2008, Presentation by Walter Ariel Risi
IBM Governance & Compliance 2008, Presentation by Walter Ariel RisiIBM Governance & Compliance 2008, Presentation by Walter Ariel Risi
IBM Governance & Compliance 2008, Presentation by Walter Ariel RisiWalter Ariel Risi
 

Más de Walter Ariel Risi (20)

ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...
ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...
ER 2002 Paper &quot;A Pattern-Based Approach to Mobile Information Systems Co...
 
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...
ICFP 98 Poster Proposal &quot;A Functional Programming Approach to Hypermedia...
 
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...
CACIC 99 Paper &quot;Effective Mapping of Hypermedia Design Primitives to Imp...
 
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;
SEPG LA 2005 Presentation &quot;Practicas Agiles En Mejora De Procesos&quot;
 
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...
AID 98 Paper &quot;Encoding and Crossover Mismatch in a Molecular Design Prob...
 
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?
¿Qué lleva a un Ingeniero de Software de Excelente a Exceptional?
 
SATURN 2011 Presentation by Walter Ariel Risi
SATURN 2011 Presentation by Walter Ariel RisiSATURN 2011 Presentation by Walter Ariel Risi
SATURN 2011 Presentation by Walter Ariel Risi
 
Software Guru Article (2006) "Enterprise Application Integration: more than j...
Software Guru Article (2006) "Enterprise Application Integration: more than j...Software Guru Article (2006) "Enterprise Application Integration: more than j...
Software Guru Article (2006) "Enterprise Application Integration: more than j...
 
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"
FEA 1998 Paper "Proteint Structure Prediction as a Complex Adaptive System"
 
Article on International Journal of Mobile Communications "An Architectural P...
Article on International Journal of Mobile Communications "An Architectural P...Article on International Journal of Mobile Communications "An Architectural P...
Article on International Journal of Mobile Communications "An Architectural P...
 
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...
OOPSLA 2001 Position Paper "Playing the Software Archeologist: Exploring and ...
 
Epm 2010 Pmi Abril 2011 V5
Epm 2010 Pmi   Abril 2011   V5Epm 2010 Pmi   Abril 2011   V5
Epm 2010 Pmi Abril 2011 V5
 
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.
Microsoft EPM 2010 Presentation at Project Management Update 2011. March 2011.
 
IT Governance. Published in “Perspectiva” (Perspective) Magazine.
IT Governance. Published in “Perspectiva” (Perspective) Magazine.IT Governance. Published in “Perspectiva” (Perspective) Magazine.
IT Governance. Published in “Perspectiva” (Perspective) Magazine.
 
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...Business Process Management: From the Stand. Published in “Perspectiva” (Pers...
Business Process Management: From the Stand. Published in “Perspectiva” (Pers...
 
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)
Oficinas de Proyectos Eficientes con Microsoft EPM 2010 (en Microsoft Uruguay)
 
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008
IEEE / UCA Talk on Software Engineering Tools, By Walter Ariel Risi, 2008
 
Software Architecture Office Presentation by Walter Ariel Risi, 2006
Software Architecture Office Presentation by Walter Ariel Risi, 2006Software Architecture Office Presentation by Walter Ariel Risi, 2006
Software Architecture Office Presentation by Walter Ariel Risi, 2006
 
IBM Rational Day 2006, Presentation by Walter Ariel Risi
IBM Rational Day 2006, Presentation by Walter Ariel RisiIBM Rational Day 2006, Presentation by Walter Ariel Risi
IBM Rational Day 2006, Presentation by Walter Ariel Risi
 
IBM Governance & Compliance 2008, Presentation by Walter Ariel Risi
IBM Governance & Compliance 2008, Presentation by Walter Ariel RisiIBM Governance & Compliance 2008, Presentation by Walter Ariel Risi
IBM Governance & Compliance 2008, Presentation by Walter Ariel Risi
 

Último

TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y maslida630411
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 

Último (20)

El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y mas
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 

Expresando Hypermedia en Programación Funcional

  • 1. Expresando Hypermedia en Programacion Funcional Ignacio Gallego Sagastume Daniel H. Marcos Pablo E. Mart nez Lopez Walter A. Risi LIFIA, Departamento de Informatica, Universidad Nacional de La Plata. C.C.11, Correo Central, 1900, La Plata, Buenos Aires, Republica Argentina. E-mail: fnick,daniel,fidel,walterg@lifia.info.unlp.edu.ar URL: http://www-lifia.info.unlp.edu.ar/ Abstract En este art culo se presentan un conjunto de herramientas constru das sobre el lenguaje funcional lazy Haskell para describir documentos hypermediales. El trabajo consiste en el dise~o e implementacion de un conjunto de funciones y tipos que permitan describir los n elementos basicos de un documento hypermedial (nodos, links, componentes multimediales y la interaccion entre ellos). La construccion de los documentos de hypermedia se realiza utilizando una metodolog a composicional, en la que componentes de hypermedia complejos se construyen combinando repetidamente otros mas simples. Esta metodolog a puede utilizarse tambien para crear componentes genericos y reusables. Otro aspecto interesante es que los documentos descritos con estas herramientas no dependen de construcciones espec cas de una plataforma de hypermedia en particular. Consecuentemente, los documentos constru dos de esta forma pueden ser trasladados luego a diferentes plataformas de hypermedia, como HTML o Ayuda de Windows, sin necesidad de efectuar modi caciones.
  • 2. Expresando Hypermedia en Programacion Funcional 1 Introduccion No hay duda de que los sistemas hypermediales Nie95] han sufrido gran expansion en los ultimos a~os. Existen multiples razones que justi can este desarrollo, aunque probablemente la mas n importante es que estos sistemas trabajan en forma interactiva, brindando un formato muy amigable de presentar informacion al usuario. Esto, unido con el abaratamiento de los medios necesarios para soportar facilidades multimediales e hypermediales (lectores de CD-ROMs, ter- minales gra cas, etc.), ha conducido a que cada vez sean mas los que se inclinan a utilizar medios hypermediales en vez de los tradicionales (medios impresos por lo general). Por otro lado, la expansion de la WWW ha generado un campo muy amplio para el desarrollo de aplicaciones hypermediales distribu das sobre redes en gran escala. La programacion funcional BW88] ofrece un gran numero de ventajas a los programadores, por ejemplo un alto nivel de abstraccion y una gran capacidad de expresion. Estas caracter sticas surgen de los poderosos mecanismos de abstraccion presentes en los lenguajes funcionales (fun- ciones de alto orden, polimor smo, etc.). Estas ventajas se re ejan en un tiempo de desarrollo de programas menor que el requerido habitualmente con lenguajes imperativos, resultando ser ademas el codigo mas facil de entender, mantener y reusar. En este art culo se presentan un conjunto de herramientas constru das sobre el lenguaje funcional lazy Haskell PH+ 96] para describir documentos hypermediales. El trabajo consiste en el dise~o e implementacion de un conjunto de funciones y tipos que permiten describir los n elementos basicos de un documento hypermedial (nodos, links, componentes multimediales y la interaccion entre ellos). El trabajo resulta novedoso pues utiliza el paradigma funcional para describir hypermedias; estas tareas han estado muy distanciadas en el ambiente informatico de Latinoamerica, y es la intencion principal de este art culo acercar ambas disciplinas. Ademas, otros aspectos atractivos del trabajo son la separacion que se obtiene entre la descripcion semantica de un documento hypermedial y su representacion visual en una plataforma determinada, y la facilidad de de nir componentes de hypermedia genericos reusables. Es importante destacar la utilizacion de una metodolog a composicional, en la que componentes de hypermedia complejos pueden constru rse combinando componentes mas simples. Finalmente, el trabajo es interesante como aplicacion de tecnicas de dise~o de programacion funcional; ejemplos de las mismas son el uso de combinadores n y transformadores. El art culo comienza con una breve introduccion a los conceptos basicos de hypermedia que se utilizan a lo largo del trabajo. En la Secc. 3 se presenta el dise~o general de la aplicacion. La n Secc. 4 describe como se realiza la traduccion de un documento descrito con las herramientas de la seccion anterior a una plataforma de hypermedia espec ca. En la Secc. 5 se presentan algunos ejemplos, y en la Secc. 6 se explican los detalles de implementacion. Finalmente, en la
  • 3. Secc. 7 se mencionan algunos trabajos relacionados. 2 Conceptos basicos sobre hypermedia Puede de nirse hypermedia como la conjuncion de multimedia e hypertexto. Se dice que una aplicacion es multimedial cuando reune dentro de ella varios medios, como texto, imagenes, video, audio, etc. Por otra parte, la manera mas simple de de nir hypertexto es haciendo una comparacion con los medios de informacion tradicionales, como libros y revistas. En un formato tradicional, la informacion se presenta en forma secuencial, es decir, existe una secuencia que de ne el orden en que la informacion debe ser considerada. En un hypertexto, por otro lado, el texto se agrupa en unidades de informacion relacionada; estas unidades son llamadas nodos, y a su vez estos pueden referenciarse unos a otros. Es importante notar que el usuario no accede a la informacion en forma secuencial, sino que lo hace siguiendo las referencias a otros nodos. Las referencias que conectan dos nodos (que pueden ser en ambos sentidos a la vez) se llaman links o hyperlinks. El nodo del cual parte el link se denomina origen del link. El nodo o parte del nodo al cual se llega a traves de la activacion de un link, se denomina destino del link. Los hyperlinks estan asociados con partes espec cas de los nodos que conectan, como por ejemplo una palabra o una imagen. Estas partes de los nodos asociadas con links se denominan anchors (anclas), y determinan, o bien el origen de un link (una parte del nodo que permite activar el link), o bien el destino (una parte particular del nodo destino a la que se llega a traves de la activacion del link). Los anchors del primer grupo se denominan anchors de origen, y los del segundo grupo anchors de destino. Muchas veces se hace distincion entre distintos tipos de links. Por ejemplo, se suele diferenciar entre links que hacen referencia a cierta parte dentro del mismo nodo, los que lo hacen a otro nodo dentro del mismo documento, y los que referencian a un nodo perteneciente a otro documento hypermedial. Ejemplos de sistemas hypermediales son la World Wide Web, Hyper-G y la Ayuda de Win- dows. 3 Descripcion del Trabajo El trabajo consiste en un conjunto de abstracciones que representan los elementos de hypermedia existentes en la mayor a de los sistemas actuales. A continuacion se presenta la formalizacion de estos elementos dentro de este trabajo, junto con las abstracciones que los representan. 3.1 Nodos Los nodos son las unidades basicas de informacion que constituyen los sistemas hypermediales. Un nodo esta constitu do internamente por bloques de informacion expresados en un medio
  • 4. particular (imagen, texto, etc.). Ademas de dichos bloques, los nodos poseen estructuras cuya funcionalidad es la de permitir conectarse a otros nodos. En este modelo la abstraccion que representa este concepto es el tipo Node. La forma de construir un nodo es a traves de la funcion de construccion node. node :: NodeId -> HG -> Node Un nodo esta compuesto por un identi cador de nodo, NodeId, y un componente, HG (Hypergad- get). El NodeId es un elemento que permite identi car un vocamente a un nodo (ver Secc. 3.5). Los Hypergadgets son los componentes mediante los cuales se constituye internamente un nodo (ver Secc. 3.3). Existen funciones que denominamos transformadores de nodos que al aplicarse a un nodo, le agregan alguna caracter stica que lo afecta en un aspecto particular. Algunas transformaciones t picas son, por ejemplo: defaultTextColor, backgroundColor :: Node -> Color -> Node La transformacion defaultTextColor determina que el nodo transformado tendra por color de texto por defecto el que se pasa como parametro. En forma similar, la transformacion backgroundColor determina el color de fondo del nodo al cual se aplica. 3.2 Hyperlinks Los hyperlinks son los elementos que permiten relacionar varios nodos entre s . Los links junto con los nodos son los elementos que estructuran los sistemas hypermediales; en particular, a partir de la existencia de los links surge la actividad denominada navegacion", la cual hace referencia al modo en que el usuario accede a la informacion dentro del sistema hypermedial. En este trabajo se distingue entre los links que conectan nodos que pertenecen a un mismo documento hypermedial y los que conectan nodos pertenecientes a distintos documentos; esta distincion pretende marcar diferencias tematicas o conceptuales antes que de ubicacion f sica. Se denomina al primer grupo Near Hyperlinks y al segundo grupo Far Hyperlinks. Los tipos que los representan son NearHL y FarHL respectivamente. Existe ademas el tipo general HL (hyperlink), cuyos elementos representan hyperlinks, independientemente de que sean near o far. La clase Hyperlink agrupa a los tipos que representan hyperlinks. Los tipos que pertenecen a esta clase son HL, NearHL y FarHL (para mas detalles ver la Secc. 6.1). El destino de un link puede ser o bien un nodo en su totalidad, o bien una parte espec ca de un nodo (un parrafo de texto determinado, una imagen, etc.). Ademas, el nodo destino y el nodo origen pueden ser el mismo nodo, con lo cual un nodo podr a tener un link a otra parte de s mismo. Por lo tanto, surge la necesidad de tener una manera de especi car el destino de un link. En este trabajo se considerara que un link contiene un destino, representado por
  • 5. la abstraccion HLDestiny (Hyperlink Destiny), la cual contendra la informacion requerida para identi car al nodo destino, o a la parte del mismo a la que se quiere llegar. Se tienen funciones de construccion para hyperlinks: nearHL :: HyperlinkDestiny a => a -> NearHL farHL :: HyperlinkDestiny a => a -> FarHL La clase HyperlinkDestiny agrupa a aquellos tipos cuyos elementos pueden ser utilizados para denotar el destino de un hyperlink. Los elementos de tipo Node o NodeId pertenecen a esta clase, ya que pueden utilizarse para indicar que ese nodo es el destino del hyperlink. El mecanismo con el cual se construyen los Hyperlink Destinys se vera con mas profundidad en la Secc. 6.1.1. 3.3 Hypergadgets Un nodo esta compuesto internamente por componentes que de nen su estructura. Ejemplos de estos componentes son bloques de texto, imagenes, listas, anchors, etc. En este trabajo se denomina Hypergadget a un componente como los mencionados. Se hace diferencia entre los Hypergadgets puramente visuales, llamados Dumb Hypergadgets, y aquellos que ademas son anchors de origen o destino de un link, denominados Anchor Hypergadgets. El tipo de los Dumb Hypergadgets es DumbHG, y el tipo de los Anchor Hypergadgets es AnchorHG. Existe ademas el tipo general HG, que representa un Hypergadget, independientemente de que sea un Dumb Hypergadget o Anchor Hypergadget. Existen Hypergadgets atomicos que representan elementos simples, como un bloque de texto, una imagen, una lista, etc. Componentes como los mencionados pueden construirse a partir de las funciones correspondientes. txtDumbHG :: String -> TxtDumbHG imgDumbHG :: ImgSource -> ImgDumbHG itemListDumbHG :: Hypergadget h => h] -> ItemListDumbHG Otros hypergadgets atomicos son los anchors. Existen anchors de origen (aquellos de los que parte un link) y anchors de destino (aquellos a los que se llega a partir de un link). El tipo de los primeros es OrgAnchorHG y el tipo de los segundos es DstAnchorHG. El tipo general AnchorHG representa un anchor, independientemente de que sea de origen o destino. Los anchors tienen ademas una parte visual. Las funciones de construccion correspondientes son orgAnchorHG y dstAnchorHG. orgAnchorHG :: (DumbHypergadget d, Hyperlink h) => d -> h -> OrgAnchorHG dstAnchorHG :: Hypergadget h => DstAnchorId -> h -> DstAnchorHG Un anchor de origen se construye a partir de un Dumb Hypergadget (elemento de un tipo per- teneciente a la clase DumbHypergadget) y de un link (elemento de un tipo de la clase Hyperlink).
  • 6. El Dumb Hypergadget constituye la parte visual del anchor, y el link es aquel del cual el anchor es origen. Un anchor de destino se construye a partir de un Hypergadget (elemento de un tipo perte- neciente a la clase Hypergadget) y de un identi cador de anchor destino, DstAnchorId, que identi ca un vocamente al anchor de destino (ver Secc. 3.5). Los elementos de los tipos DstAnchorHG y DstAnchorId pueden ser utilizados para indicar el destino de un link, por lo tanto, pertenecen a la clase HyperlinkDestiny. La clase de tipo Hypergadget agrupa a los tipos que denotan Hypergadgets. Ademas, las clases DumbHyperGadget y AnchorHypergadget, subclases de la anterior, agrupan a los tipos que representan Dumb Hypergadgets y Anchor Hypergadgets, respectivamente (ver Secc. 6.2 para detalles de implementacion). Los tipos DumbHG, TxtDumbHG, ImgDumbHG y ItemListHG son instancias tanto de la clase Hypergadget como DumbHypergadget. De la misma manera, los tipos AnchorHG, OrgAnchorHG y DstAnchorHG son instancias tanto de la clase Hypergadget como AnchorHypergadget. Otra instancia de la clase Hypergadget es el tipo HG. Se presenta a continuacion un peque~o ejemplo en donde se utilizan las funciones de cons- n truccion anteriormente vistas. Lo que se de ne es un anchor de origen, toAnchor, y un anchor destino, anchorDst, el cual representa una lista de elementos. La expresion thisNodeId sim- plemente se corresponde al identi cador del nodo al que se esta estructurando. -- Definicion de Dumb Hypergadgets item1 = txtDumbHG "Item1" item2 = txtDumbHG "Item2" lista = itemListDumbHG item1, item2] -- Definicion de hyperlinks y Anchor Hypergadgets anchorDst = dstAnchorHG (dstAnchorId "anchorDst" thisNodeId) lista nearLink = nearHL anchorDst toAnchor = orgAnchorHG (txtDumbHG "Observar la lista ...") nearLink 3.3.1 Combinacion y transformacion de Hypergadgets Un combinador de Hypergadgets es una funcion que toma dos o mas Hypergadgets, devolviendo uno mas complejo que resulta de la combinacion de los mismos. Dicha combinacion se hace siguiendo reglas de layout, y algunos combinadores son, por ejemplo: aboveOf, belowOf, leftOf, rightOf, next :: (Hypergadget a, Hypergadget b) => a -> b -> HG
  • 7. La combinacion aboveOf, por ejemplo, toma dos Hypergadgets, y retorna uno nuevo que resulta de ubicar el primero arriba del segundo. Los demas combinadores se comportan de manera analoga. Los operadores (/=), (=/), (<=<), (>=>) y (+++), son equivalentes a aboveOf, belowOf, leftOf, rightOf y next, respectivamente. La eleccion de ordenes de precedencia adecuados reduce el uso de los parentesis necesarios al escribir expresiones usando estos combinadores. infixr 6 <=<, >=> infixr 5 /=, =/ infixr 4 +++ Algunos Dumb Hypergadgets interesantes que se utilizan junto con los combinadores de layout mencionados son hSpace y vSpace. hSpace, vSpace :: Int -> DumbHG Las funciones hSpace y vSpace sirven para dejar espacios (horizontales y verticales, respecti- vamente) de una cierta cantidad de pixels. Estos componentes se utilizan exclusivamente por razones de layout. Otro Hypergadget importante es el Hypergadget nulo. Este es el elemento neutro para cualquiera de las combinaciones vistas anteriormente. La funcion nullHG permite crear un elemento de este tipo. nullHG :: DumbHG Un transformador de Hypergadgets es una funcion que al aplicarse a un Hypergadget le agrega alguna caracter stica que lo afecta en algun aspecto particular. Algunas de las transformaciones t picas son: txtColor :: Color -> TxtDumbHG -> TxtDumbHG justifyL, justifyC, justifyR :: HG -> HG La transformacion txtColor toma un Hypergadget de texto, TxtDumbHG, y le asigna un color particular. Las transformaciones justifyC, justifyR y justifyL hacen que el Hypergadget transformado este alineado al centro, derecha o izquierda, respectivamente. Un transformador interesante es txtWithAnchors, el cual provee una forma practica de insertar anchors de origen en un componente de texto. Esta funcion toma dos argumentos: una lista de asociaciones entre Strings e hyperlinks y un Hypergadget de texto. El resultado de aplicar esta funcion es un componente de tipo HG, en donde los componentes de texto que guran en la lista son reemplazados por anchors de origen con los correspondientes links. txtWithAnchors :: Hyperlink h => (String, h)] -> TxtDumbHG -> HG La utilizacion de la funcion anterior evita el tener que de nir los anchors en forma separada, y luego combinarlos mediante el operador (+++).
  • 8. 3.4 Documentos hypermediales Un documento hypermedial es una coleccion de nodos relacionados entre s por links. En este trabajo la abstraccion que representa este concepto es el tipo HD (hypermedia document), y la forma de construir un documento es a traves de la funcion de construccion hd. hd :: HDId -> Node] -> HD Un documento hypermedial esta compuesto por un identi cador de documento, HDId, y un con- junto de nodos. Un HDId es un elemento que permite identi car un vocamente a un documento hypermedial (ver Secc. 3.5). 3.5 Identi cadores Algunos componentes requieren ser identi cados un vocamente dentro de la hypermedia que se esta construyendo. Para esto se utilizan estructuras denominadas identi cadores. Un identi cador de tipo NodeId permite identi car en forma un voca a un nodo. Un elemento de este tipo se construye mediante la funcion nodeId. nodeId :: String -> HDId -> NodeId El String con el cual se construye el NodeId es un nombre que debe ser unico para cada nodo en un mismo documento, pudiendose repetir en nodos de distintos documentos hypermediales. El identi cador de anchor de destino esta representado por el tipo DstAnchorId y los ele- mentos de este tipo se construyen mediante la funcion dstAnchorId. dstAnchorId :: String -> NodeId -> DstAnchorId El String con el cual se construye el DstAnchorId debe ser unico dentro del nodo en donde se ubica el DstAnchor en cuestion. El tipo HDId representa al identi cador de documento hypermedial y los elementos de este tipo se construyen mediante la funcion hdId. hdId :: String -> HDId El String con el cual se construye el HDId debe ser unico de ese documento. 4 Portabilidad a diferentes plataformas Las construcciones provistas en la Secc. 3 permiten expresar la estructura y la apariencia de un documento hypermedial sin hacer uso de caracter sticas espec cas de una plataforma de hyper- media particular. De esta forma, un documento expresado con las construcciones ya presentadas
  • 9. puede ser trasladado sin modi caciones a cualquier plataforma de hypermedia (HTML, Ayuda de Windows, etc.), utilizando funciones de traduccion. Las funciones de traduccion a una plataforma espec ca se proveen en modulos que el usuario importa dependiendo de la plataforma que elija. El modulo de una plataforma no solo provee las funciones de traduccion, sino tambien estructuras y funciones que permiten incorporar ca- racter sticas propias de la misma; estas caracter sticas no estan inclu das en el modelo base por ser muy espec cas de una plataforma particular. Supongase que se decide traducir el documento a la plataforma HTML. Lo primero que debe hacerse es importar el modulo de la plataforma HTML. import HTML El modulo HTML provee la funcion de traduccion renderHD. La misma convierte un documento hypermedial constru do con las estructuras vistas, a un conjunto de archivos HTML. type PageNames = (NodeId, String)] renderHD :: HD -> PageNames -> IO () La funcion renderHD toma un documento hypermedial y una lista de pares que asocia a cada nodo un nombre de archivo. El resultado de evaluar la funcion es un conjunto de archivos HTML. Notese que la funcion anterior utiliza entrada/salida monadica Wad95, GH95]. Otra funcion de traduccion provista por el modulo HTML es renderHDs, que permite la tra- duccion de varios documentos. renderHDs :: (HD, PageNames)] -> IO () La funcion renderHDs es necesaria cuando se de nen documentos con hyperlinks entre s . El modulo HTML provee ademas funciones que permiten incorporar construcciones espec cas de la plataforma HTML. Un ejemplo es el transformador de nodo backgroundImg. backgroundImg :: ImgSource -> Node -> Node La funcion backgroundImg toma un elemento ImgSource (especi ca donde esta el archivo de imagen) y un elemento Node, y devuelve un nodo que tiene como fondo a la imagen especi cada. El tipo ImgSource es una construccion que permite especi car el archivo fuente de una imagen. Cada plataforma provee una de nicion para este tipo, por ejemplo, en la plataforma HTML un elemento del tipo ImgSource corresponde a un URL. type ImgSource = URL El tipo URL es espec co de la plataforma HTML. Un elemento de este tipo puede constru rse mediante la funcion url.
  • 10. url :: String -> URL El elemento de tipo String que recibe la funcion corresponde a un URL. 5 Ejemplos A continuacion, se presentan tres ejemplos del uso de las estructuras descritas en este trabajo. El primero muestra la forma de construir un documento hypermedial sencillo con las estructuras vistas; el segundo ejemplo ilustra como las herramientas provistas son utiles para de nir nuevos componentes reusables a partir de los existentes; en el tercer y ultimo ejemplo, se ejempli ca el uso de hyperlinks para conectar ambos documentos. Notese que en estos ejemplos se utiliza HTML como la plataforma destino, por lo cual se utilizan algunas construcciones propias del modulo espec co de la plataforma HTML. 5.1 Un Documento Simple Supongase que se desea escribir una pagina de WWW que brinde informacion basica sobre la 2da Conferencia Latinoamericana de Programacion Funcional. Con esta aplicacion, se modelara como un documento hypermedial con un unico nodo. Se comienza de niendo un componente de texto que sera el t tulo de la pagina. Se desea que el t tulo se destaque del resto del texto; para esto, se utiliza la transformacion txtLevel con el parametro H1, lo cual indica que se trata de un t tulo de importancia. Aparte de esta transformacion, se utiliza txtColor, para que el texto resultante se muestre en color rojo, y la transformacion justifyL para que el componente este alineado a la izquierda. title str = justifyL $ txtLevel H1 $ txtColor Red $ txtDumbHG str El operador $ es simplemente aplicacion de funciones; se lo utiliza en el ejemplo para evitar el uso excesivo de parentesis. El siguiente paso consiste en de nir un subt tulo. subTitle str = justifyL $ txtLevel H2 $ txtColor Red $ txtDumbHG str Observese que en este caso el transformador txtLevel lleva como parametro adicional H2, lo cual indica que el componente de texto en cuestion es un t tulo de menor importancia que el anterior. La siguiente tarea consiste en escribir un parrafo de introduccion. Ademas, se desea que el dicho parrafo contenga un hyperlink a la pagina de la primera edicion de la conferencia, para lo cual habra que de nir dicho link e insertar un anchor en que lo active. clapfIntro = txtWithAnchors ('primera edicion', toFirstEd)] $ txtDumbHG "Estamos orgullosos de anunciar la organizacion de la 2da
  • 11. Conferencia Latinoamericana de Programacion Funcional. El exito de la primera edicion nos alienta a continuar trabajando para lograr las metas que nos guiaron: " El link toFirstEd se de ne como sigue: toFirstEd = farHL $ url "http://www-lifia.info.unlp.edu.ar/~lambda/first/spanish" El hyperlink anterior es un FarHL ya que sale del documento corriente. El destino del link se especi ca mediante un URL (que puede incluirse usando la funcion url, espec ca de la plataforma HTML) ya que el documento en cuestion no esta de nido dentro de esta aplicacion, sino que existe como documento HTML independiente. Para completar el documento, se desea crear una lista de tems con las razones principales que motivan la realizacion de la conferencia. Se utiliza para esto el componente itemListHG. aimList = itemListDumbHG item1, item2, item3] item1 = txtDumbHG "Promover el uso de la programacion funcional en ambientes academicos y no academicos." item2 = txtDumbHG "Promover el acercamiento entre los investigadores y el intercambio de conocimientos y experiencias." item3 = txtDumbHG "Dar a conocer las experiencias de aplicacion practica y las posibilidades que ofrece la programacion funcional." De nidos todos los componentes, solo resta combinarlos todos en el cuerpo del nodo. clapfBody = title "2da Conferencia Latinoamericana de Programacion Funcional" /= subtitle "3 y 4 de Octubre de 1997, La Plata, Argentina" /= divisionLine /= clapfIntro /= aimList /= divisionLine El componente divisionLine es una l nea divisoria, que se incluye para mejorar la presentacion del documento. El paso restante es de nir un nodo con el cuerpo, clapfBody, y un documento hypermedial que contenga a ese nodo. clapfNodeId = nodeId "CLapF Home Page" clapfDocId clapfNode = backgroundImg (url "fondo1.gif") $ defaultTxtColor Black $ node clapfNodeId clapfBody
  • 12. clapfDocId = hdId "Home Page De CLaPF" clapfDoc = hd clapfDocId clapfNode] Notese que al nodo de nido se le aplican dos transformaciones. La transformacion backgroundImg (espec ca de la plataforma HTML) determina que se utilizara el archivo fondo1.gif como gra co de fondo para la pagina. La transformacion defaultTxtColor determina que el color de texto por defecto sera negro. Se tiene entonces un documento simple que cuenta con un unico nodo. Supongase que se desea transladar este documento a plataforma HTML; se utiliza para esto la funcion renderHD del modulo HTML, de la siguiente manera: clapfAssocList = (clapfNodeId, "clapf.htm")] main = renderHD clapfDoc clapfAssocList La funcion main anterior genera una pagina de WWW, cuyo codigo HTML reside en el archivo clapf.htm. La pagina puede verse en la Fig. 1. 1 Figure 1: Pagina de la 2da Conferencia Latinoamericana de Programacion Funcional. 1 La visualizacion de las paginas HTML se realiza utilizando Netscape Navigator Version 3.01. Copyright 1994-1996 Netscape Communications Corporation.
  • 13. 5.2 De niendo Nuevos Componentes La motivacion del segundo ejemplo es de nir un documento con datos personales de dos in- vestigadores. Por simplicidad, los datos que se consideran son nombre, fecha de nacimiento y posicion dentro de la universidad. Ademas, se desea que estos datos se provean junto a una foto de la persona en cuestion. Para dar una presentacion estandar de los datos de las personas, y para evitar escribir codigo innecesario, se crea un componente reusable personalFile. personalFile :: String -> String -> String -> ImgDumbHG -> OrgAnchorHG -> String -> DstAnchorHG personalFile name date position image back id = dstAnchorHG id $ justifyC $ (txtSize S6 $ txtColor Maroon $ txtDumbHG name) /= vSpace 20 /= image <=< dataList /= back /= divisionLine where item s1 s2 = (txtColor Green $ txtDumbHG s1) +++ (txtDumbHG s2) dataList = itemListDumbHG item "Birth Date: " date, item "Position: " position] El componente personalFile es un componente complejo, constru do a partir de otros mas simples; ademas, es un componente generico que se instancia a partir de los datos de una persona en particular. Ademas de cada una de las chas personales, se desea tener un ndice al principio de la pagina. Para esto, se construye el componente generico makeIndex. makeIndex :: Hyperlink l => (String, ImgDumbHG, l)] -> HG makeIndex xs = justifyC $ foldr (<=<) nullHG (map build xs) where build (n,i,l) = justifyC $ (orgAnchorHG i l) /= (txtSize S4 $ txtDumbHG n) La funcion makeIndex recibe una lista de tuplas, formadas por un String, un ImgDumbHG, y un elemento de la clase Hyperlink, que son el nombre, la imagen y el link a la cha de esa persona, respectivamente. El resultado de la aplicacion de la funcion es un componente complejo, en el que la imagen de una persona es anchor a su correspondiente cha; ademas, debajo de cada imagen se coloca un componente de texto TxtDumbHG que corresponde al nombre de esa persona.
  • 14. A continuacion puede verse el codigo que describe el documento completo haciendo uso de los componentes genericos personalFile y makeIndex. import HTML -- Modulo de la plataforma HTML. import MAIN -- Modulo principal. import NEWC -- Modulo con los componentes personalFile y makeIndex. -- Definicion del titulo y el subtitulo. title str = justifyC $ txtLevel H1 $ txtColor Blue $ txtDumbHG str titleId = dstAnchorId "Title" thisNodeId pageTitle str = dstAnchorHG titleId (title "Functional Programming Researchers") -- Definicion del indice y las secciones del documento. imagePEML = imgDumbHG (url "peml.jpg") imageMAC = imgDumbHG (url "mac.jpg") namePEML = "Pablo E. Martinez Lopez" nameMAC = "Marcelo A. Cardos" pageIndex = makeIndex (namePEML, imagePEML, toSection1), (nameMAC, imageMAC, toSection2)] section1 = personalFile namePEML "20/3/1968" "Researcher" imagePEML backToIndex (dstAnchorId "PEML" thisNodeId) section2 = personalFile nameMAC "4/4/1966" "Researcher" imageMAC backToIndex (dstAnchorId "MAC" thisNodeId) backToIndex = justifyC $ orgAnchorHG (txtDumbHG "Back to Index") toIndex -- Definicion del cuerpo del documento. pageBody = pageTitle /= pageIndex /= divisionLine /= section1 /= section2 -- Definicion de hyperlinks. toSection1 = nearHL section1 toSection2 = nearHL section2 toIndex = nearHL pageTitle
  • 15. -- Definicion del nodo. thisNodeId = nodeId "Second Example" thisDocId thisNode = backgroundImg (url "fondo2.gif") $ defaultTxtColor Black $ node thisNodeId pageBody -- Definicion del documento. thisDocId = hdId "Second Example" thisDoc = hd thisDocId thisNode] -- Traduccion a la plataforma HTML. assocList = (thisNodeId, "ejemplo2.htm")] main = renderHD thisDoc assocList El documento, trasladado a plataforma HTML, puede verse en la Fig. 2. Figure 2: Pagina de nida utilizando componentes genericos.
  • 16. 5.3 Conectando los ejemplos anteriores Supongase ahora que se desea que el documento generado en el segundo ejemplo contenga un link al documento que se construyo en el primer ejemplo. Lo primero que debe hacerse es importar la de nicion del primer documento al archivo del segundo. import CLAPF El siguiente paso consiste en crear el hyperlink. Como se trata de documentos diferentes, el link a construir sera de tipo FarHL (Far Hyperlink). linkToCLaPF = farHL clapfNodeId Una vez de nido el hyperlink hay que inclu rlo en el cuerpo del documento mediante el correspondiente anchor, modi cando la de nicion de pageBody del ejemplo de la Secc. 5.2. anchorToCLaPF = justifyC $ orgAnchorHG (txtDumbHG "Go to ClaPF page") linkToCLaPF pageBody = pageTitle /= pageIndex /= divisionLine /= section1 /= section2 /= anchorToCLaPF Una vez inclu do en el cuerpo del documento, solo resta transladarlo a la plataforma HTML. Como se tienen dos documentos, se utiliza la funcion renderHDs en vez de renderHD. main = renderHDs (clapfAssocList, clapfId), (assocList, thisDocId)] La pagina de WWW resultante puede verse en la Fig. 3. 6 Implementacion En esta seccion se explican los puntos importantes sobre la implementacion de algunas de las abstracciones mencionadas. Uno de los puntos a destacar es la forma en que se utilizaron las clases de tipos de Haskell para describir los conceptos de hyperlink e Hypergadget.
  • 17. Figure 3: Extension del segundo ejemplo. 6.1 Implementacion de hyperlinks Existen tres tipos que implementan el concepto de hyperlink dentro del trabajo. Estos tipos son NearHL, FarHL y HL. Los tipos NearHL y FarHL representan los conceptos de Near Hyperlink y Far Hyperlink, respectivamente. data NearHL = NearHL HLDestiny data FarHL = FarHL HLDestiny El tipo HLDestiny se detalla en la Secc. 6.1.1. Un elemento del tipo HL encapsula, o bien a un elemento del tipo NearHL, o bien a uno del tipo FarHL. data HL = ANearHL NearHL | AFarHL FarHL El tipo HL se utiliza junto con la clase Hyperlink para expresar links que pueden ser tanto near como far. La clase Hyperlink agrupa a los tipos HL, NearHL y FarHL. Los elementos de estos tipos pueden convertirse al tipo general HL.
  • 18. class Hyperlink h where toHL :: h -> HL El tipo HL y la clase Hyperlink son utilizados por funciones polimor cas que toman o devuelven tanto Near Hyperlinks como Far Hyperlinks. Un ejemplo es la funcion orgAnchorHG, la cual construye un anchor de origen. orgAnchorHG :: (DumbHypergadget d, Hyperlink h) => d -> h -> OrgAnchorHG orgAnchorHG d h = OrgAnchorHG (toDumbHG d) (toHL h) La clase DumbHypergadget y la funcion toDumbHG se ven con detalle en la Secc. 6.2. 6.1.1 Hyperlink Destinys El tipo HLDestiny (Hyperlink Destiny) describe el destino de un hyperlink. data HLDestiny = HLNodeDestiny NodeId | HLAnchorDestiny DstAnchorId | APSHLDestiny PSHLDestiny El destino de un hyperlink puede ser un nodo, un anchor, o puede estar expresado por una construccion espec ca de alguna plataforma de hypermedia particular (por ejemplo, un URL en HTML). El tipo PSHLDestiny esta implementado en el modulo de cada plataforma, y en particular en el modulo HTML esta implementado como un sinonimo del tipo URL. La clase HyperlinkDestiny agrupa a los tipos que pueden usarse para construir el destino de un hyperlink, y sus instancias son Node, NodeId, DstAnchor, DstAnchorId, y PSHLDestiny. Los elementos de los tipos mencionados pueden convertirse al tipo HLDestiny. class HyperlinkDestiny d where toHLDestiny :: d -> HLDestiny Un ejemplo t pico del uso de esta clase es la funcion de construccion de Near Hyperlinks. nearHL :: HyperLinkDestiny d => d -> NearHL nearHL d = NearHL (toHLDestiny d) 6.2 Implementacion de Hypergadgets El tipo mas importante que representa a los Hypergadgets es el tipo HG. data HG = ADumbHG DumbHG | AnAnchorHG AnchorHG | AboveOf HG HG
  • 19. | LeftOf HG HG | JustifyL HG | JustifyC HG | JustifyR HG | NullHG HG es el tipo de los Hypergadgets en forma general. Un elemento de este tipo puede encapsular a elementos de los tipos DumbHG y AnchorHG, y tambien a combinaciones y transformaciones de Hypergadgets. La clase Hypergadget agrupa a los tipos que representan a los Hypergadgets. Los elementos de los tipos pertenecientes a esta clase pueden convertirse al tipo general HG. class Hypergadget h where toHG :: h -> HG Ejemplos de uso de esta clase son los combinadores y transformadores de Hypergadgets. aboveOf :: (Hypergadget a, Hypergadget b) => a -> b -> HG above h1 h2 = (toHG h1) `AboveOf` (toHG h2) justifyC :: Hypergadget h => h -> HG justifyC h = JustifyC (toHG h) De manera similar DumbHG es el tipo mas general para expresar Dumb Hypergadgets. data DumbHG = ATxtDumbHG TxtDumbHG | AnImgDumbHG ImgDumbHG | AnItemListDumbHG ItemListDumbHG | DivisionLine | HSpacer Int | VSpacer Int La clase DumbHypergadget agrupa a los tipos que denotan Dumb Hypergadgets, e incluye a TxtDumbHG, ImgDumbHG y ItemListDumbHG. Los elementos de los mencionados tipos pueden convertirse al tipo general DumbHG. Esta clase es subclase de Hypergadget, y por lo tanto sus instancias deben permitir tambien la conversion al tipo HG. class Hypergadget h => DumbHypergadget h where toDumbHG :: h -> DumbHG Un ejemplo del uso de esta clase es la funcion orgAnchorHG, vista en un ejemplo anterior (ver Secc. 6.1). El tipo mas general de los Anchor Hypergadgets es AnchorHG.
  • 20. data AnchorHG = AnOrgAnchorHG OrgAnchorHG | ADstAnchorHG DstAnchorHG La clase AnchorHypergadget agrupa a los tipos que denotan Anchor Hypergadgets, e incluye a OrgAnchorHG y DstAnchorHG. Los elementos de los mencionados tipos pueden convertirse al tipo general AnchorHG. Esta clase es subclase de Hypergadget, y por lo tanto sus instancias deben permitir tambien la conversion al tipo HG. class Hypergadget h => AnchorHypergadget h where toAnchorHG :: h -> AnchorHG Un ejemplo del uso de esta clase se da en la implementacion de la funcion toHG para el tipo DstAnchorHG. instance Hypergadget DstAnchorHG where toHG h = AnAnchorHG (toAnchorHG h) 7 Trabajos relacionados La utilizacion de una metodolog a composicional para construir estructuras mas complejas a partir de estructuras mas simples no es nueva, y fue utilizada entre otros en Fok95] para parsers funcionales, en Hud96] para expresar composiciones musicales de forma declarativa, en FJ96] y HC95] para construir interfaces gra cas en lenguajes funcionales y en FJ95] para expresar gra cos. En particular, la forma en que se utilizan transformadores y combinadores para expresar layout y detalles de presentacion visual de componentes multimediales, es muy similar a la utilizada en FJ96] y HC95] para manejar el layout y presentacion de componentes de GUIs y la utilizada en FJ95] para de nir la disposicion f sica de componentes gra cos. La construccion de estructuras de hypermedia genericas y reusables y la creacion de estruc- turas de hypermedia complejas a partir de la combinacion de otras mas simples ha sido utilizada, entre otros por FNN96], desde la perspectiva del paradigma de orientacion a objetos. 8 Conclusiones Se ha presentado una forma de construir documentos hypermediales mediante herramientas constru das en un lenguaje funcional. Los bene cios usuales de la programacion funcional se aplican a este trabajo: el alto nivel de abstraccion, la gran capacidad de expresion y la facilidad de razonar sobre los programas, lograda gracias a la transparencia referencial. El trabajo propone tambien el uso de combinadores y transformadores para construir es- tructuras complejas a partir de otras mas simples. Esta caracter stica, combinada con el uso de funciones de alto orden, permite la creacion de componentes de hypermedia genericos altamente reusables.
  • 21. Por otro lado, las herramientas provistas permiten describir un documento hypermedial sin utilizar construcciones espec cas de una plataforma de hypermedia particular, logrando que el documento pueda ser trasladado sin modi caciones a distintas plataformas. Finalmente, otro punto a destacar de este trabajo es el acercamiento entre disciplinas habi- tualmente muy distanciadas en el ambito informatico latinoamericano, como son la construccion de sistemas de hypermedia y la programacion funcional. Revisiones posteriores de las versiones preliminares de este trabajo por investigadores del area de hypermedia se han mostrado positivas respecto de la utilizacion del paradigma funcional en esta area. Lo anterior es un incentivo para continuar con el desarrollo de las ideas presentadas en este art culo. References BW88] Richard S. Bird and Philip Wadler. Introduction to Functional Programming. Prentice Hall, 1988. FJ95] Sigborn Finne and Simon Peyton Jones. Pictures: A simple structured graphics model. In Glasgow Functional Programming Workshop, July 1995. FJ96] Sigborn Finne and Simon Peyton Jones. Composing the user interface with Haggis. In John Launchbury, Erik Meijer, and Tim Sheard, editors, Advanced Functional Programming, LNCS 925, pages 1{37. Springer-Verlag, Aug 1996. FNN96] S. Fra sse, J. Nanard, and M. Nanard. Generating hypermedia from speci cations by sketching multi- media templates. In Proceedings of the ACM Multimedia '96, 1996. Fok95] Jeroen Fokker. Functional parsers. In Johan Jeuring and Erik Meijer, editors, Advanced Functional Programming, LNCS 925, pages 1{23. Springer-Verlag, May 1995. GH95] Andrew D. Gordon and Kevin Hammond. Monadic I/O in Haskell 1.3. In Paul Hudak, editor, Proceed- ings of the Haskell Workshop, pages 50{69, La Jolla, California, June 1995. HC95] Thomas Hallgren and Magnus Carlsson. Programming with fudgets. In Johan Jeuring and Erik Meijer, editors, Advanced Functional Programming, LNCS 925, pages 137{182. Springer-Verlag, May 1995. Hud96] Paul Hudak. Haskore music tutorial. In John Launchbury, Erik Meijer, and Tim Sheard, editors, Advanced Functional Programming, LNCS 925, pages 38{67. Springer-Verlag, Aug 1996. Nie95] Jakob Nielsen. Multimedia and Hypertext: The Internet and Beyond. Academic Press Inc., 1995. PH+ 96] John Peterson, Kevin Hammond, et al. Report on the programming language Haskell, a non{strict, purely functional language. Version 1.3. Technical report, Yale University, May 1996. Wad95] Philip Wadler. Monads for functional programming. In Johan Jeuring and Erik Meijer, editors, Advanced Functional Programming, LNCS 925. Springer-Verlag, May 1995. Appendix A continuacion, se listan las principales de niciones de tipos, clases de tipos y funciones del trabajo. Nodos { Tipos
  • 22. data NodeId = ... data Node = ... type NodeTitle = ... { Funciones de construccion nodeId :: String -> HDId -> NodeId node :: Hypergadget a => NodeId -> a -> Node { Transformadores backgroundColor :: Color -> Node -> Node defaultTxtColor :: Color -> Node -> Node Hyperlinks { Tipos data HL = ... data NearHL = ... data FarHL = ... data HLDestiny = ... { Clases de tipos class Hyperlink a where ... class HyperlinkDestiny a where ... { Instancias de clases instance Hyperlink HL where ... instance Hyperlink NearHL where ... instance Hyperlink FarHL where ... instance HyperlinkDestiny NodeId where ... instance HyperlinkDestiny Node where ... instance HyperlinkDestiny PSHLDestiny where ... instance HyperlinkDestiny DstAnchorId where ... instance HyperlinkDestiny DstAnchorHG where ... { Funciones de construccion nearHL :: HyperlinkDestiny a => a -> NearHL farHL :: HyperlinkDestiny a => a -> FarHL Hypergadgets { Tipos
  • 23. data HG = ... data DumbHG = ... data TxtDumbHG = ... data ImgDumbHG = ... data ItemListDumbHG = ... data TableDumbHG = ... data TableRow = ... data AnchorHG = ... data OrgAnchorHG = ... data DstAnchorId = ... data DstAnchorHG = ... { Clases de Tipos class Hypergadget a where ... class (Hypergadget a) => DumbHypergadget a where ... class (Hypergadget a) => AnchorHypergadget a where ... { Instancias de clases instance Hypergadget HG where ... instance Hypergadget DumbHG where ... instance Hypergadget TxtDumbHG where ... instance Hypergadget ImgDumbHG where ... instance Hypergadget ItemListDumbHG where ... instance Hypergadget TableDumbHG where ... instance Hypergadget AnchorHG where ... instance Hypergadget OrgAnchorHG where ... instance Hypergadget DstAnchorHG where ... instance DumbHypergadget DumbHG where ... instance DumbHypergadget TxtDumbHG where ... instance DumbHypergadget ImgDumbHG where ... instance DumbHypergadget ItemListDumbHG where ... instance DumbHypergadget TableDumbHG where ... instance AnchorHypergadget AnchorHG where ... instance AnchorHypergadget OrgAnchorHG where ... instance AnchorHypergadget DstAnchorHG where ... { Funciones de construccion nullHG :: HG txtDumbHG :: String -> TxtDumbHG imgDumbHG :: ImgSource -> ImgDumbHG
  • 24. itemListDumbHG :: Hypergadget a => a] -> ItemListDumbHG tableDumbHG :: TableRow] -> TableDumbHG tableRow :: Hypergadget a => a] -> TableRow divisionLine :: DumbHG hSpace, vSpace :: Int -> HG orgAnchorHG :: (Hyperlink a, DumbHypergadget b) => b -> a -> OrgAnchorHG dstAnchorId :: String -> NodeId -> DstAnchorId dstAnchorHG :: Hypergadget a => DstAnchorId -> a -> DstAnchorHG { Combinadores (/=), aboveOf, (=/), belowOf, (>=>), rightOf, (<=<), leftOf, (+++), next :: (Hypergadget a, Hypergadget b) => a -> b -> HG { Transformadores tableWidth :: Int -> TableDumbHG -> TableDumbHG tableRowColor :: Color -> TableRow -> TableRow txtWithAnchors :: Hyperlink a => (String, a)] -> TxtDumbHG -> HG txtLevel :: TxtLevel -> TxtDumbHG -> TxtDumbHG txtColor :: Color -> TxtDumbHG -> TxtDumbHG txtSize :: TxtSizes -> TxtDumbHG -> TxtDumbHG justifyL, justifyC, justifyR :: Hypergadget a => a -> HG Documentos hypermediales { Tipos data HDId = ... data HD = ... { Funciones de construccion hdId :: String -> HDId hd :: HDId -> Node] -> HD