Programación Funcional Avanzada



Documentos relacionados
Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

CLASS JAVASCRIPT CLASES? OBJETOS PREDEFINIDOS. WINDOW, OBJETO GLOBAL. NUMBER, MATH, DATE, REGEXP, ERROR. (CU01144E)

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B)

Transformación de documentos XML con

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Estructuras de Datos y Algoritmos. Árboles de Expresión

Modulo 1 El lenguaje Java

Definición de XQuery.

Capítulo 3: XML Spy como editor de documentos XML. 2. La interfaz de usuario de XML Spy

Listados y Etiquetas personalizados de PrefGest WhitePaper Julio 2008

Tema: Sobrecarga de Operadores.

Figura 4.1 Clasificación de los lenguajes de bases de datos

Programación Web Avanzada: AJAX y Google Maps

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

1 OBJETOS, DOM, JSON

Guía de migración a firma HMAC SHA256 Conexión por Redirección

Tutorial Servicios Web

XML y XQuery. Qué es XML? Qué es XML? (II) Ejemplo de fichero XML. Cuerpo de un documento XML. Estructura de un documento XML

extensible Markup Language (XML)

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Sistemas de Información 12/13 XML (extensible Mark-up Language)

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Fundamentos de las tecnologías de la información

Cómo gestionar menús en Drupal 7

Análisis de esquemas XML [1]

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

BÚSQUEDA AVANZADA EN INTERNET

Capítulo 6. Introducción a la POO

VAST: Manual de usuario. Autores: Francisco J. Almeida-Martínez Jaime Urquiza-Fuentes

Profesorado de Informática Ciencias de la Computación INET- DFPD Matemática I - Matemática Discreta usando el computador Ing. Prof.

XML para FP : Introducción

MICROSITIOS. Perfiles

Visualización y Transformaciones en XML

Tema: Arreglos de Objetos en C++.

Datos Estadísticos y el Lenguaje XML

XML. Introducción. Cómo se usa? XML Tree. Sintaxis XML

VISUAL BASIC Diseño de Formularios MDI y Menús - Proyectos Aplica

ESTRUCTURAS CONDICIONALES EN PHP: SWITCH, CASE, BREAK. EJEMPLOS DE USO Y EJERCICIOS RESUELTOS. (CU00820B)

Interacción y manejo de documentos XML.

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

Objetivos y Temario CURSO PROGRAMACION JAVASCRIPT Y JQUERY

Herramienta Solver. Activar Excel Solver

3.2 Operaciones aritmético-lógicas en Pascal

Tarea 1 Diseño Web en entorno cliente José Luis Comesaña

XML. Necesitamos un formato de datos: Posibles usos. Estandard Robusto Extensible

9. Objetos y clases Clases

4 ARQUITECTURA DE COMUNICACIONES

Programación Orientada a Objetos en JAVA

Tipos de variables, características generales y aspectos específicos de PHP de estos elementos básicos de la programación.

7. Definición de un estilo en función del contexto.

José Ramón Olalla. Crear un curso nuevo en Edmodo. Manuales jr2.0 - José Ramón Olalla Celma

GENERACIÓN Y CONSTRUCCIÓN DE DOCUMENTOS XML

Universidad Católica del Maule. Fundamentos de Computación Especificación de tipos de datos ESPECIFICACIÓN ALGEBRAICA DE TIPOS DE DATOS

Programación I: Funciones y módulos

Informática I Notas del curso

Base de datos en la Enseñanza. Open Office

DISEÑO ORGANIZACIONAL. Diseño web avanzado con HTML5 y CSS5

XSL. Introducción. Introducción. Introducción

Tutorial Ambiente de Trabajo en InfoStat

Roberto Gómez Cárdenas Qué es DOM?

Luis Eduardo Barón Bienvenidos al Módulo N. 3 de Internet Para Emprendedores. Yo soy Luis Eduardo Barón. Álvaro Mendoza Y yo soy Álvaro Mendoza.

CONSULTAS MULTITABLAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Un kilobyte (KB) son 1024 bytes, un Megabyte (MB) son 1024 KB, un Gigabyte son 1024 Mb

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

La elección de Blogger como la plataforma o lugar donde

DESCARGA E INSTALACIÓN DE LA DOCUMENTACIÓN PARA LAS CLASES DEL API DE JAVA. CONSULTAR EN LOCAL O EN INTERNET? (CU00910C)

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación

Introducción a la programación orientada a objetos

Introducción a XML - Validación y Parseo. Huibert Aalbers, Senior Certified Software IT Architect

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

EJEMPLOS JSON ARCHIVO O FICHERO DATOS. CAMBIO FORMATO CONVERTIDOR ON LINE JSON A XML Y XML A JSON. MINIFICAR (CU01214F)

JavaScript como Orientación a Objetos

Capítulo 1 Documentos HTML5

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Módulo mod_banners para insertar y visualizar anuncios o publicidad (banners) en Joomla. Contador. (CU00446A)

Se puede acceder a dicho módulo a través de la siguiente dirección URL:

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario.

Centro de Capacitación en Informática

Programa por Clase. 8. CSS3 9. Ejercicio Práctico 10. Examen

Formularios HTML. Elementos de Programación y Lógica

BLOG: PUNTADA A PUNTADA

Plantilla de texto plano

Inside. Gestión de Expedientes y Documentos Electrónicos

EUROPIO ENGINE LAB: FORMULARIOS WEB Y TABLAS HTML EN SOLO

UML, ejemplo sencillo sobre Modelado de un Proyecto

*si tuvieron algún problema pueden verificar la documentación oficial Vamos a crear una BD llamada droid_login como lo muestra la siguiente imagen:

LENGUAJES DE PROGRAMACIÓN 4 MÓDULOS. 56 Horas

Aplicaciones Lineales

TPV Virtual Santander Elavon: Guía de desarrollador- Almacenamiento seguro de tarjetas con definiciones XML. Versión: 1.1

Envío y recepción de SMS mediante GSM-CTRL en una Galaxia vía OPC

Transcripción:

Programación Funcional Avanzada Procesamiento de Texto Estructurado Ernesto Hernández-Novich <emhn@usb.ve> Universidad Simón Bolívar Copyright 2010-2015 Hernández-Novich (USB) Programación Funcional Avanzada 2015 1 / 23

Procesar JSON La lingua franca de los servicios web Formato JSON para intercambio de datos Basado en texto simple. Estructura legible para el humano. Subconjunto propio de JavaScript para serialización. Objetos construidos como listas nombre/valor. Nombres cadenas alfanuméricas. Valores null, cadenas, números, booleanos, arreglos unidimensionales u objetos anidados. Siempre hace falta un reconocedor. Mejor que XML... Hernández-Novich (USB) Programación Funcional Avanzada 2015 2 / 23

JSON en Haskell Aprovechando el sistema de tipos Haskell incluye reconocedores y emisores de JSON como casi cualquier otro lenguaje. Data.Aeson altamente optimizada y fácil de usar. Data.Aeson.Encode.Pretty mostrar JSON bonito Hernández-Novich (USB) Programación Funcional Avanzada 2015 3 / 23

Una encuesta sobre pizza... de una aplicación web, de un startup, blah data Person = Person { firstname ::!Text, lastname ::!Text, age ::!Int, likespizza ::! Bool } deriving ( Show ) La aplicación manejará los datos internamente en este formato. Los desarrolladores del front-end necesitan JSON. Hernández-Novich (USB) Programación Funcional Avanzada 2015 4 / 23

El API fundamental Data.Aeson Codificar JSON hacia un ByteString encode :: ToJSON a = > a - > ByteString Decodificar entrada JSON desde un ByteString decode :: FromJSON a = > ByteString - > Maybe a Decodificador con descripción de errores eitherdecode :: FromJSON a = > ByteString - > Either String a Variantes estrictas en el resultado decode :: FromJSON a = > ByteString - > Maybe a eitherdecode :: FromJSON a = > ByteString - > Either String a Hernández-Novich (USB) Programación Funcional Avanzada 2015 5 / 23

JSON desde y hacia archivos Intercambio de datos local [ { " firstname " : " John ", " lastname " : " Doe ", " age " : 24, " likespizza " : true }... ] No tiene por qué estar indentado. Podría ser gigantesco lazy ByteString FTW! Nos encantaría terminar con [Person]. Hernández-Novich (USB) Programación Funcional Avanzada 2015 6 / 23

JSON desde archivos La magia de GHC {-# LANGUAGE OverloadedStrings, DeriveGeneric # -} import Data. Text import GHC. Generics data Person = Person { firstname ::!Text, lastname ::!Text, age :: Int, likespizza :: Bool } deriving ( Show, Generic ) instance FromJSON Person instance ToJSON Person ByteString, Text o String? OverLoadedStrings GHC genera instancias FromJSON y ToJSON automáticamente. Hernández-Novich (USB) Programación Funcional Avanzada 2015 7 / 23

JSON desde archivos Pruebas con valores inmutables > eitherdecode $ fromstring goodjson :: Either String [ Person ] Right [ Person { firstname = " John ",... }, Person { firstname = " Rose ",... }] > eitherdecode $ fromstring badjson :: Either String [ Person ] Left " when expecting a Bool, encountered Number instead " Decodificación requiere Text o ByteString por eso fromstring Resultado o error de sintaxis explicativo. Hernández-Novich (USB) Programación Funcional Avanzada 2015 8 / 23

JSON desde archivos Y desde el archivo? main = do d <- ( eitherdecode <$> B. readfile " pizza. json ") :: IO ( Either String [ Person ] case d of Left err - > putstrln err Right ps - > print ps En este caso es necesario anotar el tipo deseado en otros programas podría no hacer falta según contexto. Aprovechar Control.Applicative Hernández-Novich (USB) Programación Funcional Avanzada 2015 9 / 23

JSON hacia archivos Codificar datos Haskell en JSON import qualified Data. ByteString. Lazy as B import qualified Data. ByteString. Lazy. Char8 as B8 person = Person { firstname = " Ernesto ", lastname = "áhernndez - Novich ", age = 45, likespizza = True } > B8. putstrln $ encode person {" lastname ":"áhernndez - Novich "," age ":45, " firstname ":" Ernesto "," likespizza ": true } Tanto Person como [Person] son codificables. Emitir ByteSring con la codificación adecuada. Hernández-Novich (USB) Programación Funcional Avanzada 2015 10 / 23

Ay, pero que feo! A los programas sólo les importa la belleza interna import Data. Aeson. Encode. Pretty B8. putstrln $ encodepretty person { " age ": 45, " firstname ": " Ernesto ", " lastname ": "áhernndez - Novich ", " likespizza ": true } Indentado y en orden alfabético. encodepretty es configurable indentación y orden. Hernández-Novich (USB) Programación Funcional Avanzada 2015 11 / 23

Y si está en un servicio web? Can I haz download? import Network. HTTP. Conduit ( simplehttp ) getjson :: IO B. ByteString getjson = simplehttp " http :// localhost /~ emhn / pizza. json " main = do d <- ( eitherdecode <$ > getjson ) :: IO ( Either String [ Person ]... Conduit modela streams perezosos archivos, HTTP... Hernández-Novich (USB) Programación Funcional Avanzada 2015 12 / 23

Más flexibilidad Data.Aeson Instancias FromJSON y ToJSON para muchos tipos Haskell. > decode " [1,2,3] " :: Maybe [ Int ] Just [1,2,3] > decode " {\" foo \":1,\" bar \":2} " :: Maybe ( Map String Int ) Just ( fromlist [("bar ",2),(" foo ",1)]) Hernández-Novich (USB) Programación Funcional Avanzada 2015 13 / 23

La implantación Parsec y librerías especializadas Objeto JSON es mapa de claves a valores Data.HashMap type Object = HashMap Text Value Arreglo (lista) JSON es un vector de valores Data.Vector type Array = Vector Value Un valor JSON puede ser data Value = Object! Object Array! Array String! Text Number! Scientific Bool! Bool Null Reconocedor escrito con AttoParsec y Blaze Hernández-Novich (USB) Programación Funcional Avanzada 2015 14 / 23

Procesamiento de HTML Y si quiero procesar HTML? Porque razones HTML está definido de manera muy precisa en un DTD los que escriben HTML suelen ser imprecisos (por no decir piratas). Múltiples librerías para manipular HTML y analizar su estructura. discutiremos Text.HTML y Text.XML Emitir HTML/XML correcto es un problema diferente que atacaremos más adelante. Descarguemos HTML para procesarlo... Hernández-Novich (USB) Programación Funcional Avanzada 2015 15 / 23

Procesamiento de HTML Conduit otra vez Es realmente práctico import Network. HTTP. Conduit ( simplehttp ) import qualified Data. ByteString. Lazy. Char8 as L url = " http :// www. google. com / search?q =42 " main = L. putstrln. L. take 500 = < < simplehttp url simplehttp interfaz simple basada en URL Sigue redirecciones automáticamente. Entrega el cuerpo de la respuesta omite encabezados. Lanza una excepción para los errores. http control sobre petición, respuesta, encabezados... Obtenemos el HTML en un ByteString Hernández-Novich (USB) Programación Funcional Avanzada 2015 16 / 23

Procesamiento de HTML Qué hacer con el HTML? Nos interesan elementos específicos del documento Queremos determinar cuántos resultados tiene la consulta donde dice about... results Esta en un <div> identificado como resultstats Construir el DOM (árbol HTML) Text.HTML.DOM Recorrer el DOM para encontrar el nodo Text.XML.Cursos Si han usado XPath, esto será un paseo; si no, también será un paseo. Hernández-Novich (USB) Programación Funcional Avanzada 2015 17 / 23

Procesamiento de HTML De ByteString a DOM HTML Reconocedor, propiamente dicho import Text. HTML. DOM ( parselbs ) import Text. XML. Cursor ( Cursor, attributeis, content, element, fromdocument, child, ($//), (& ), (&//), (>=>)) cursorfor :: String - > IO Cursor cursorfor url = do page <- simplehttp url return $ fromdocument $ parselbs page parselbs de ByteString a DOM HTML (Document) fromdocument de Document a un Cursor que, es un zipper! Hernández-Novich (USB) Programación Funcional Avanzada 2015 18 / 23

Procesamiento de HTML Búsqueda en el DOM Operando sobre el zipper Cursor findnodes :: Cursor - > [ Cursor ] findnodes = element " div " >= > attributeis " id" " resultstatus " >= > child element seleccionar elementos con nombre específico. attributeis filtrar sólo aquellos con el atributo descrito. child quedarse con los hijos del nodo en contexto. >=> composición Kleisli para Monads (WAT?) (>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c Basta pasar de Cursor a texto Hernández-Novich (USB) Programación Funcional Avanzada 2015 19 / 23

Procesamiento de HTML Extrayendo el contenido De múltiples cursores... import qualified Data. Text as T extractdata :: Cursor - > T. Text extractdata = T. concat. content content tomar los nodos del Cursor que tengan texto. Como podría haber más de uno, usamos concat. Falta mostrar los resultados (que podrían ser varios en algunos escenarios) Hernández-Novich (USB) Programación Funcional Avanzada 2015 20 / 23

Procesamiento de HTML Mostrando los resultados Combinar y convertir a String processdata :: [ Text ] -> IO () processdata = putstrln. T. unpack. T. concat concat combinar múltiples Text. unpack Convertir Text en String Resta expresar el flujo del traductor. Hernández-Novich (USB) Programación Funcional Avanzada 2015 21 / 23

Procesamiento de HTML El programa principal Flujo de datos main = do cursor <- cursorfor url processdata $ cursor $// findnodes $ extractdata ($//) tomar todos los nodos de un Cursor que cumplan con el criterio de búsqueda. ($ ) aplicar la función de extracción a todos los nodos de una lista. Infijos, de la misma precedencia, asociando a la izquierda. Hernández-Novich (USB) Programación Funcional Avanzada 2015 22 / 23

Bibliografía Quiero saber más... RFC-4627 The application/json Media Type for JSON Documentación de Data.Aeson Documentación de Text.HTML.Dom Documentación de Text.XML.Cursor Hernández-Novich (USB) Programación Funcional Avanzada 2015 23 / 23