Saturday, December 10, 2016

Haskell Trading System

Por lo que estaban haciendo esta asignación en Uni y tengo un ansia de hacer la asignación en haskell. Es una simulación de un motor de negociación de valores. La situación es que tenemos datos procedentes de un csv y queremos analizar cada registro y procesarlo de cierta manera dependiendo de qué fase de mercado está asignado. La justificación para usar haskell, es que veo el motor de comercio como sistema funcional pesado. He tenido haskell experiencia antes pero sólo una experiencia menor, nunca nada tan grande. Estábamos queriendo ejecutar un hilo que importaría los csvs en una cola de órdenes sin procesar y luego tener el acceso al programa principal esta cola para procesar cada pedido. Sin embargo, cómo podría lograr esto sé que en C i sólo configurar la clase para que pueda acceder a la clase CSVParser que mantendría la cola sin procesar. Esto también significa que el hilo de importación estaría funcionando continuamente a través de todas las fases del mercado o hasta que terminó de importar el archivo csv. Cualquier orientación sobre cómo lograr esto sería genial (no buscando un guión completamente mecanografiado, justo lo que las cosas en haskell que tendría que mirar) preguntó Mar 29 12 a las 23:33 cerrado como no es una pregunta real por Ritch Melton. Dflemstr. Flexo 9830. Michael Petrotta. Graviton Mar 30 12 at 1:45 Es difícil decir lo que se está preguntando aquí. Esta pregunta es ambigua, vaga, incompleta, excesivamente amplia o retórica y no puede ser contestada razonablemente en su forma actual. Para obtener ayuda para aclarar esta pregunta para poder volver a abrirla, visite el centro de ayuda. Si esta pregunta puede ser reformulada para que se ajuste a las reglas del centro de ayuda. (2015) Muchas empresas han utilizado Haskell para una gama de proyectos, incluyendo: ABN AMRO Amsterdam, Países Bajos ABN AMRO es un banco internacional con sede en Amsterdam. Para sus actividades de banca de inversión es necesario medir el riesgo de contraparte en las carteras de derivados financieros. ABN AMRO039s CUFP charla. Aetion Technologies LLC, Columbus, Ohio Aetion fue un contratista de defensa en funcionamiento de 1999 a 2011, cuyas aplicaciones utilizan la inteligencia artificial. Las prioridades rápidamente cambiantes hacen que sea importante minimizar el impacto del código de los cambios, lo que se adapta bien a Haskell. Aetion desarrolló tres proyectos principales en Haskell, todos ellos exitosos. El código conciso de Haskell039 era quizás el más importante para la reescritura: hacía práctico desechar el viejo código de vez en cuando. Los DSEL permitieron que la IA se especificara muy declarativamente. Conversación del CUFP de Aetion039s. Alcatel-Lucent Un consorcio de grupos, entre ellos Alcatel-Lucent, ha utilizado Haskell para prototipos de sistemas de radio de software de banda estrecha, funcionando en tiempo real (blando). Allston Trading, LLC es un fabricante de mercado de alta frecuencia en más de 40 intercambios financieros, en 20 países y en casi todas las clases de productos concebibles. Allston hace un poco de uso de Haskell para su infraestructura comercial. Alpha Heavy Industries Alpha Heavy Industries es un gestor de activos alternativos dedicado a producir rendimientos superiores a través de métodos cuantitativos. Ellos usan Haskell como su lenguaje de implementación principal. Amgen Thousand Oaks, California Amgen es una compañía de terapias humanas en la industria de la biotecnología. Amgen fue pionero en el desarrollo de nuevos productos basados ​​en los avances en el ADN recombinante y la biología molecular y lanzó la biotecnología industrys primeros medicamentos de éxito. Amgen utiliza Haskell para construir rápidamente software para implementar modelos matemáticos y otras aplicaciones complejas, matemáticamente orientadas Proporcionar una validación matemáticamente más rigurosa del software Para romper a los desarrolladores de su rut de desarrollo de software, dándoles una nueva forma de pensar sobre el software. Amgen039s CUFP hablar. Ansemond LLC quotFind It Keep It es un Mac Web Browser que te permite mantener las páginas que visitas en una base de datos. Una lista de estas páginas se muestra en la vista 039database view039. Antiope Fair Haven, Nueva Jersey Antiope Associates proporciona soluciones personalizadas para problemas de comunicación inalámbrica y redes. Nuestro equipo tiene experiencia en todos los aspectos del diseño de sistemas inalámbricos, desde las capas físicas y de protocolo hasta complejas aplicaciones en red. Antiope Associates se basa en una serie de técnicas avanzadas para garantizar que los sistemas de comunicación que diseñamos son fiables y libres de errores. Utilizamos herramientas de simulación personalizadas desarrolladas en Haskell para modelar nuestros diseños de hardware. Antiope039s CUFP hablar. ATampT Haskell se utiliza en la división de Seguridad de Red para automatizar el procesamiento de las quejas por abuso de Internet. Haskell nos ha permitido cumplir fácilmente plazos muy ajustados con resultados fiables. Banco de América Merril Lynch Haskell se utiliza para la transformación de datos de back-end y la carga. Grupo de Análisis Cuantitativo de Barclays Capital El grupo de Análisis Cuantitativo de Barclays Capital039s está usando Haskell para desarrollar un lenguaje funcional específico del dominio incrustado (llamado FPF) que se utiliza para especificar derivados de renta variable exóticos. Estos derivados, que naturalmente se describen mejor en términos de funciones matemáticas, y construidos de forma compositiva, se mapean bien para ser expresados ​​en un lenguaje funcional incorporado. Este idioma está siendo usado regularmente por personas que no tenían experiencia previa en el lenguaje funcional. BAE Systems Como parte del proyecto SAFE, BAE ha creado una colección de compiladores, intérpretes, simuladores y EDSL casi en su totalidad en Haskell. CUFP 2013 talk BazQux Reader BazQux Reader es un lector de RSS comercial. Sus rastreadores de feeds y comentarios y una parte del servidor web se implementan en Haskell. Mejor Mejor, antes conocido como Erudify, es una empresa de aprendizaje construida en torno a la misión de hacer que las personas mejor. Somos una mezcla inusual de una empresa de software, una empresa de consultoría y una agencia creativa. Esta estrecha integración nos permite ofrecer cursos innovadores y de alta calidad a nuestros clientes. Fundada en 2012, Better tiene su sede en Zurich, Suiza y Nueva York, Estados Unidos. Mejor está totalmente invertido en Haskell La mayoría de las partes de nuestro sistema de back-end (servidores web y lógica de aprendizaje) están escritas en Haskell. Haskell también se utiliza en la mayoría de las partes de nuestro sistema de front-end. BCODE Pty Ltd Sydney Australia bCode Pty Ltd es una pequeña empresa de capital riesgo de arranque utilizando Ocaml y un poco de Haskell en Sydney, Australia. Bdellium Hawaii, Estados Unidos Bdellium desarrolla sistemas de software que permiten a las empresas del sector financiero ofrecer nuevos servicios al cliente que crecen su negocio. Bdellium utiliza Haskell para el análisis de levantamiento pesado en la infraestructura de back-end. Bluespec, Inc. Waltham, Massachusetts El desarrollo de un circuito integrado moderno (ASIC o FPGA) es un proceso enormemente costoso que involucra especificación, modelado (para elegir y arreglar la arquitectura), diseño (para describir lo que se convertirá en silicio) y verificación Cumple con las especificaciones), todo antes de comprometer realmente nada a silicio (donde el costo de un fracaso puede ser decenas de millones de dólares). Bluespec, Inc. es una empresa de tres años de antigüedad que proporciona servicios lingüísticos, metodologías y herramientas para este propósito, dentro del marco de los lenguajes estándares IEEE SystemVerilog y SystemC, pero aprovechando ideas en gran medida de los sistemas de reescritura temporal y lenguajes de programación funcionales como Haskell . En esta charla, después de un breve resumen técnico para definir el contexto, describiremos nuestras tácticas y estrategias, y los desafíos que enfrentamos, en la introducción de ideas de programación declarativa en este campo, tanto externamente (convencer a los clientes sobre el valor de estas ideas) y Internamente (utilizando Haskell para nuestra implementación de herramientas). Bluespec039 s CUFP charla. Bump Bump utiliza un servidor basado en Haskell, Angel. Para el supervisor de procesos para todos sus sistemas de back-end y para otras tareas de infraestructura. Haskell en Bump Capital IQ Hemos estado utilizando la programación funcional aquí en SampP Capital IQ en Scala, Haskell, y nuestro idioma de elaboración propia Armin, desde 2008 para la analítica financiera. Capital IQ039s CUFP 2013 talk Chordify Chordify es un servicio de música en línea gratuito que transforma la música, desde YouTube, Deezer, SoundCloud o archivos cargados, en acordes. Hay un informe de experiencia de ICFP que explica cómo se usa Haskell para esto: Jos Pedro Magalhes y W. Bas de Haas. Modelación funcional de la armonía musical: un informe de la experiencia. Cirmas Marca Karma Singapur Marca Karma ofrece servicios a los propietarios de marcas para medir sentimientos en línea hacia sus marcas. Haskell se utiliza en la construcción de partes del producto, específicamente para la programación de tareas de back-end y la coincidencia de marcas. CircuitHub CircuitHub pretende ser el AWS para la fabricación, lo que permite a las empresas de hardware y fabricantes instantáneamente citar diseños y escala de prototipo a la producción. También estamos orgullosos de albergar una gran colección de diseños de hardware abiertos. CircuitHub utiliza Haskell para nuestros servicios y algoritmos principales. GMAG, el grupo de modelos cuantitativos de Credit Suisse, ha estado utilizando Haskell para varios proyectos desde principios de 2006, con el doble objetivo de mejorar la productividad de los modeladores y Por lo que es más fácil para otras personas dentro del banco utilizar modelos GMAG. Los proyectos actuales incluyen: • Trabajo adicional sobre herramientas para la comprobación, manipulación y transformación de hojas de cálculo; • Lenguaje específico de dominio incorporado en Haskell para la implementación de componentes reutilizables que pueden ser compilados en varias formas de destino. Conversación de CUFP del Credit Suisse039s. Detexify Detexify es un sistema de reconocimiento de escritura a mano en línea, cuyo backend está escrito en Haskell. Fynder Fynder es una plataforma de reserva online. Utilizamos Haskell y clojurescript, todos cosidos junto con nixos Ver más en su anuncio de trabajo original. Deutsche Bank Equity Propiedad Propia, Trading Direccional de Crédito El Grupo Direccional Credit Trading utiliza Haskell como el principal lenguaje de implementación para toda su infraestructura de software. Conversación de CUFP del Deutsche Bank039s. Eaton Cleveland, Ohio Diseño y verificación de sistemas de vehículos híbridos hidráulicos Eaton039s CUFP talk Experiencias de Eaton039s utilizando un Haskell DSL Ericsson AB Ericsson utiliza Haskell para la implementación de feldespato, un EDSL para algoritmos de procesamiento de señales digitales. Ericsson039s Feldspar compilador extensibl Nueva Zelanda-basado compañía. Proporciona una variedad de desarrollo de software, consultoría, servicios de soporte operacional en todo el mundo. Tanto Haskell como Ur / Web se utilizan activamente para proyectos comerciales. Facebook Facebook utiliza algunos Haskell internamente para herramientas. Lex-pass es una herramienta para manipular programaticamente una base de código PHP a través de Haskell. Facebook039s CUFP talk Facebook039s El sistema HaXL es de código abierto Factis Research La investigación Factis, ubicada en Freiburg, Alemania, desarrolla soluciones móviles fiables y fáciles de usar. Nuestro software cliente se ejecuta en J2ME, Symbian, iPhone OS, Android y Blackberry. Los componentes del servidor se implementan en Python y Haskell. Estamos utilizando activamente Haskell para una serie de proyectos, la mayoría de los cuales se publican bajo una licencia de código abierto. Factis039 Presentación HCAR fortytools gmbh Ubicada en Hamburgo, Alemania, estamos desarrollando herramientas de productividad basadas en la web para facturación, gestión de clientes, programación de recursos y seguimiento del tiempo. Mientras usamos Javascript para construir aplicaciones de frontend en el navegador, usamos Haskell para implementar los backends REST. Además, hacemos el trabajo ocasional del proyecto / del cliente también. Ah, y por supuesto desarrollamos y mantenemos Hayoo:) Functor AB. Estocolmo, Suecia Functor AB ofrece nuevas herramientas para un análisis estático innovador con generación de casos de pre-test para eliminar defectos e insectos en software muy pronto en desarrollo. Functor colabora con el reactor de fusión JET de EFDA CCFE. JET es actualmente el reactor más grande del mundo en su tipo. En Functor, casi todo el desarrollo se realiza en Haskell pero también en cierta medida también C y Scala. Ver más en el Functor AB trabajo anuncio Funktionale Programmierung Dr. Heinrich Hrdegen. Munich, Alemania Desarrollamos prototipos de software según el principio de Pareto: Después de gastar sólo el 20 por ciento del presupuesto, nuestro objetivo es proporcionar ya el 80 por ciento de la funcionalidad del software. Podemos realizar esto construyendo un 2080-software-prototipo que podemos desarrollar más lejos en una solución verdadera. Galois, Inc Portland, Oregón Galois diseña y desarrolla software de alta confianza para aplicaciones críticas. Nuestro enfoque innovador para el desarrollo de software proporciona altos niveles de seguridad, pero su escalabilidad nos permite abordar los problemas más complejos. Hemos diseñado con éxito proyectos bajo contrato para corporaciones y clientes del gobierno en las áreas de aplicación exigentes de seguridad, aseguramiento de la información y criptografía. Galois039 2007 CUFP hablan Galois039 2011 CUFP hablan Galois039 retrospectiva sobre 10 años de uso industrial de Haskell Google Haskell se utiliza en una pequeña cantidad de proyectos internos en Google, para el soporte interno de la infraestructura de TI, y el proyecto Ganeti de código abierto. Ganeti es una herramienta para gestionar clusters de servidores virtuales construidos sobre Xen y KVM. Google039s ICFP 2010 experiencia informe sobre Haskell Video de ICFP Proyecto Ganeti en Google Glyde Glyde utiliza OCaml y Haskell para unos pocos proyectos. Glyde utiliza Haskell para nuestro traductor de fuente a fuente de plantilla de cliente, que convierte plantillas de vista tipo HAML en código JS. Grupo de Comercio Grupo de Comercio utiliza Haskell para impulsar el componente principal de su infraestructura de publicidad: un servidor web basado en Snap Framework. Haskell ha permitido un desarrollo más rápido, una mayor fiabilidad y una mejor mantenibilidad que otros idiomas, sin tener que sacrificar el rendimiento. Hasura Hasura es un BaaS / PaaS enfocado a mantener las cosas secas y le permite escribir código personalizado con las herramientas que amas. We039re está construyendo una plataforma de micro-servicio llamada API Instantánea para aplicaciones web de amplificador y móviles (lanzamiento alfa programado en el verano de 2015), y utilizamos Haskell como el lenguaje de programación central para construirlo. Humane Software Desarrollamos sistemas empresariales con backups Haskell desacoplados y asincrónicos e interfaces de usuario JavaScript. Para nuestro cliente actual, un proveedor de conectividad a Internet, escribimos una solución para monitorear múltiples máquinas remotas y analizar gigabytes de muestras de tráfico. Haskell demostró ser una excelente herramienta para el trabajo. Hemos sido capaces de reemplazar los sistemas legados de una manera granular, pieza por pieza, mientras que la entrega de nuevas características. Hustler Turf Equipment Hesston, Kansas Diseña, construye y vende cortadoras de césped. Utilizamos un poco de Haskell, especialmente como un idioma quotglue para unir datos de diferentes sistemas relacionados con la fabricación. También lo usamos para algunas aplicaciones web que se implementan en nuestra red de distribuidores. También hay algunos usos para hacer sysadmin de automatización, como la adición / eliminación de personas de servidores LDAP y similares iba Consulting Gesellschaft - Arquitectura de negocio inteligente para usted. Leipzig, Alemania iba CG desarrolla software para grandes empresas: análisis de riesgos y solución de informes para la gestión de contratos de empresas de suministro de energía, gestión de aserción, software de reserva y presupuesto para una de las firmas de contabilidad más importantes del mundo. IMVU, Inc IMVU, Inc. es una compañía de entretenimiento social que conecta a los usuarios a través de experiencias basadas en avatar 3D. Vea el artículo del blog Lo que le gusta usar a Haskell Informatik Consulting Systems AG ICS AG desarrolló una herramienta de simulación y pruebas basada en un DSL (Domain Specific Language). El DSL se utiliza para la descripción de la arquitectura y el comportamiento de los componentes del sistema distribuido (evento / mensaje basado, reactivo). El compilador fue escrito en Haskell (con el lenguaje de destino Ada). El sistema de prueba se utiliza en algunos proyectos industriales. Intel Intel ha desarrollado un compilador Haskell como parte de su investigación sobre el paralelismo multinúcleo a escala. Leer el documento de investigación de Intel sobre el compilador IVU Traffic Technologies AG El grupo de clasificación de IVU Traffic Technologies AG ha estado utilizando Haskell para comprobar las listas de conformidad con la normativa de la CE. Nuestra implementación se basa en un DSL incorporado para combinar las reglas únicas reglas en un solver que no sólo decide sobre instancias, sino que, en el caso de una lista defectuosa, encuentra una interpretación de la lista que es favorable en el sentido de que los mensajes de error que Son útiles para guiar al despachador a la resolución del asunto en cuestión. El solucionador es fiable (debido a la fuerte tipificación estática ya la transparencia referencial no hemos experimentado un fallo en tres años) y eficiente (debido a la propagación de restricciones, una estrategia de búsqueda personalizada y evaluación perezosa). Nuestro componente CE 561/2006 es parte de la suite de software IVU. crew y, como tal, está ampliamente difundido en toda Europa, tanto en la planificación como en el despacho. Así que la próxima vez que entre en un autobús regional, lo más probable es que la lista de pilotos haya sido revisada por Haskell. JanRain JanRain utiliza Haskell para software de red y web. Lea más acerca de Haskell en JanRain y en su charla de tecnología en Galois. JanRain039s quot Capturar quot usuario producto de la API se basa en Haskell039s Snap webframework. Vea la charla técnica de Janrain039 sobre su uso de los Laboratorios Snap Joyride Joyride Laboratories es un estudio de desarrollo de juegos independiente, fundado en 2009 por Florian Hofer y Snke Hahn. Su primer juego, el quotNikki y el Robotsquot fue lanzado en 2011. Keera Studios Keera Studios Ltd es un estudio de desarrollo de juegos europeo que desarrolla aplicaciones móviles, de escritorio y web. Juegos: El juego para Android Magic Cookies fue escrito en Haskell y lanzado en 2015. Otros juegos incluyen Haskanoid. Ahora está siendo desarrollado para Android. Y una librería y motor multi-plataforma de Graphic Adventure con soporte para Android y un IDE. Programación Reactiva y GUIs: Keera Studios es también el mantenedor de Keera Hails. Un framework de desarrollo de aplicaciones rápidas reactivas Open-Source, que se ha utilizado en Gale IDE y otras aplicaciones de escritorio. Existen backends para el Gtk, Qt, Wx, el toolkit nativo de la GUI de Android039 y el DOM Web a través de GHCJS. Keera Posture es un monitor de postura de código abierto escrito en Haskell usando Keera Hails y Gtk. Web: Keera Studios también desarrolla aplicaciones web en Yesod. Consulte la página de Facebook para obtener detalles sobre los juegos de Android y el desarrollo en curso. Linkqlo Linkqlo Inc es un startup de tecnología basado en Palo Alto que está construyendo una comunidad móvil pionera para conectar a la gente con ropa mejor ajustada. Estaba resolviendo un punto de dolor en toda la industria tanto para los consumidores como para las marcas de moda en compras al por menor, tamaño y ajuste, al igual que Paypal se enfrentó al desafío de pago en línea en 1999. Comenzamos a implementar Haskell como lenguaje backend en agosto de 2015, Para finalmente reemplazar todas las API de punto final de PHP con las de Haskell. Linspire, Inc. ha utilizado la programación funcional desde su creación en 2001, comenzando con el uso extensivo de O039Caml, con un cambio constante a Haskell como sus implementaciones y bibliotecas han madurado. La detección de hardware, el empaquetado de software y la generación de páginas web CGI son áreas en las que hemos utilizado extensivamente la programación funcional. El conjunto de funciones Haskell039s nos permite reemplazar gran parte de nuestro uso de idiomas pequeños (por ejemplo, bash o awk) y lenguajes de dos niveles (C o C enlazados a un lenguaje interpretado), lo que permite un desarrollo más rápido, un mejor uso compartido de código y implementaciones más rápidas. Por encima de todo, valoramos la comprobación de tipo estático para minimizar los errores de tiempo de ejecución en aplicaciones que se ejecutan en entornos desconocidos y para envolver programas heredados en funciones fuertemente tipificadas para garantizar que pasemos argumentos válidos. Linspire039s CUFP hablar Linspire039s experiencia informe sobre el uso de la programación funcional para gestionar una distribución Linux LumiGuide LumiGuide es una empresa de software innovadora que se especializa en el estacionamiento inteligente y sistemas de guía para bicicletas y automóviles. LumiGuide desarrolló e instaló el sistema de bicicletas P-route para la ciudad de Utrecht en 2015. Este sistema guía a los ciclistas a través de pantallas digitales a nivel de calle a la plaza de aparcamiento disponible en un número de estacionamientos en el centro de la ciudad. Utrecht es la primera ciudad en el mundo que tiene un sistema como este. La tecnología de detección se basa en sensores ópticos independientes de los soportes de bicicletas. Los sensores se montan en el techo en instalaciones interiores y se montan en polos en instalaciones al aire libre. Cada minuto, un sensor detecta de 40 a 60 plazas de aparcamiento al mismo tiempo en los puestos de bicicletas individuales o de dos niveles, así como en los lugares de estacionamiento gratuitos (libres). También se detectan las bicicletas que exceden la duración máxima del estacionamiento (039), y el sistema mantendrá automáticamente un registro de las imágenes de la bicicleta huérfana que se puede utilizar como evidencia cuando la bicicleta huérfana es removida por un operador de la instalación. El uso de la instalación puede ser monitoreado con software de control basado en la web. LumiGuide también desarrolla las pantallas digitales interiores y exteriores que se pueden controlar utilizando el software de control basado en web. Estamos utilizando extensivamente Haskell y NixOS. Microsoft Microsoft utiliza Haskell para su sistema de serialización de producción, Bond. Bond se utiliza ampliamente en Microsoft en servicios de gran escala. Microsoft Research ha sido, por separado, un patrocinador clave del desarrollo de Haskell desde fines de los años noventa. MITER MITER utiliza Haskell para, entre otras cosas, el análisis de protocolos criptográficos. The New York Times Un equipo del New York Times utilizó la biblioteca de arreglos paralelos Haskell039s para procesar imágenes de la Semana de la Moda de Nueva York 2013. Haskell fue elegido en base a sus paquetes de arrays numéricos rápidos, y facilidad de paralelización. Análisis de modelos Haskell en la redacción NICTA NICTA ha utilizado Haskell como parte de un proyecto para verificar el microkernel L4. Leer el artículo de Dr. Dobbs sobre el uso de Haskell y métodos formales para verificar un núcleo NRAO NRAO ha utilizado Haskell para implementar los algoritmos de ciencia de núcleo para el Sistema de Programación Dinámica (DSS) Robert C. Byrd Green Bank Telescope (GBT). GitHub. NS Solutions ha contratado a Haskell desde 2008 para desarrollar sus paquetes de software, incluyendo quotBancMeasurequot, un paquete de software de contabilidad de marcas para el mercado para instituciones financieras, quotBancMeasure for IFRSquot y quotMamecifquot, un paquete de análisis de datos. QuotBancMeasurequot y quotMamecifquot son marcas registradas de NS Solutions Corporation en JAPÓN. NVIDIA En NVIDIA, tenemos un puñado de herramientas internas que están escritas en Haskell Openomy Openomy039s API v2.0 se desarrolla en Haskell, utilizando la plataforma web HAppS. Oblomov Oblomov Systems es una empresa de software de una persona con sede en Utrecht, Países Bajos. Fundada en 2009, Oblomov ha trabajado desde entonces en varios proyectos relacionados con Haskell. El foco principal se encuentra en las aplicaciones web y editores (basados ​​en la web). Haskell ha resultado ser extremadamente útil para la implementación de servidores web que se comunican con clientes de JavaScript o aplicaciones de iPhone. Oblomov039s Presentación de HCAR. Patch-Tag: hosting for Darcs Necesita un lugar para poner su código Darcs Inténtelo. Patch-Tag está construido con happstack. La continuación del proyecto anteriormente conocido como HAppS. Peerium, Inc Cambridge, Massachusetts En Peerium, nos esforzamos por brindar un nuevo nivel de calidad y eficiencia a la comunicación y colaboración en línea en comunidades virtuales, redes sociales y entornos empresariales. Creemos que un nuevo entorno que apoye el intercambio sin esfuerzo tanto de información como de software permitirá un nivel de cooperación en línea mucho más allá de las actuales tecnologías basadas en Web. Las modernas técnicas de programación permitirán la creación de programas más robustos y poderosos dentro de estos entornos. Con este fin, estamos construyendo una nueva plataforma de software para la comunicación directa y en tiempo real y la colaboración dentro de entornos de gran riqueza gráfica. Peerium está situado en el corazón de Harvard Square en Cambridge, Massachusetts. PlanIt9 PlanIt9 es una aplicación web basada en Yesod para definir, planificar, programar y realizar tareas de seguimiento. It039s diseñado para ser rápido, simple, colaborativo y rentable. Actualmente estamos registrando usuarios para nuestro programa beta. Plumlife Plum está reemplazando los interruptores de luz con Lightpads un dimmer capacitivo de contacto que está conectado a Internet, se agrupa con otros Lightpads en el hogar para el control de grupo. Haskell compone nuestros servicios en la nube y Erlang se utiliza para el software incorporado en los Lightpads (recarga de código en caliente, agrupación de nodos fácil, etc.). Utilizamos Haskell ampliamente para todos nuestros servicios de cloud software en Plumlife. Idioma y ecosistema asombrosos. Qualcomm, Inc Qualcomm utiliza Haskell para generar enlaces Lua a la plataforma BREW SQream En SQream usamos Haskell para una gran parte de nuestro código. Utilizamos Haskell para el compilador, que toma las sentencias SQL y las convierte en instrucciones de bajo nivel para el alto rendimiento CUDA runtime. También usamos Haskell para prototipado rápido y para muchas utilidades auxiliares. Paralelo Científico. Boulder, Colorado. Estamos utilizando Haskell para desarrollar un sistema de gestión de recursos de alta disponibilidad escalable para grandes clusters (millones de nodos). Un elemento clave del diseño es proporcionar mecanismos escalables y confiables para comunicar las fallas y coordinar las transiciones de recuperación. Véase Parallel Scientific039s CUFP talk Renaissaince Informática del Instituto. Chapel Hill, Carolina del Norte El Renaissance Computing Institute (RENCI), una organización multiinstitucional, reúne a expertos multidisciplinarios y capacidades tecnológicas avanzadas para abordar problemas de investigación urgentes y encontrar soluciones a problemas complejos que afectan la calidad de vida en Carolina del Norte. Nación y el mundo. Investigadores de RENCI han utilizado Haskell para una serie de proyectos, incluyendo The Big Board. RENCI039s CUFP hablar. Samplecount Samplecount desarrolla aplicaciones de sonido y música móviles, con reconocimiento de ubicación. Actualmente están utilizando Haskell para la creación de prototipos de sus componentes de streaming de sonidos en el lado del servidor y como una herramienta de compilación multiplataforma para sus aplicaciones y marcos móviles. Sankel Software Albuquerque, Nuevo México Sankel Software ha estado utilizando Haskell desde 2002 para el prototipado y el despliegue de tecnologías que van desde CAD / CAM a juegos y animación por ordenador. Nos especializamos en el desarrollo de aplicaciones fáciles de usar, grandes y de largo plazo que resuelven problemas difíciles y conceptualmente intrincados. Scrive Scrive es un servicio de e-firma de licitaciones, contratos y otros documentos. Ayudamos a nuestros clientes a cerrar acuerdos más rápidamente, a disminuir su carga administrativa ya mejorar la experiencia de sus clientes. Siemens Convergence Creators GmbH Austria Siemens CVC utiliza Haskell desde hace unos años en el dominio espacial. Comenzando con herramientas pequeñas como la conversión de datos y la automatización de tareas de scripting sobre los instaladores usamos Haskell actualmente para Proxies de Protocolo Espacial para permitir conectar diferentes sistemas espaciales (por ejemplo Cortex a NCTRS o SLE a NCTRS con manejo COP-1). El uso principal es actualmente un Simulador implementado en Haskell que maneja partes de NCTRS (o SSB), la estación terrestre y partes del satélite para poder realizar pruebas de circuito cerrado para el Sistema de Control de Misión basado en SCOS-2000. Está en uso para probar y depurar el Sistema de Control de Misión y para comprobar la implementación de nuevas características. Ha servido para varias misiones actualmente activas y también está en uso para algunas misiones por venir. Signali Portland, Oregon Signali Corp es una nueva empresa de diseño de hardware personalizado. Nuestros principales productos son núcleos IP personalizados dirigidos a aplicaciones DSP y criptográficas integradas. Nuestra especialidad es el diseño e implementación de algoritmos complejos computacionalmente complejos. Las interfaces de cada núcleo son modulares y pueden ser modificadas muy eficientemente para su aplicación específica. La integración y validación a nivel de sistema es crucial y es la mayoría de la inversión en un producto. Soostone New York, NY Soostone es un proveedor avanzado de tecnología de análisis que se especializa en oportunidades de optimización algorítmica en marketing, precios, publicidad, ventas y gestión de productos. Como lenguaje preferido, Haskell se utiliza intensivamente en Soostone en numerosas aplicaciones, incluyendo algoritmos de aprendizaje de máquina personalizados, modelos / simulaciones, motores de toma de decisiones en tiempo real, DSL / EDSL, aplicaciones web y API de alto volumen. Standard Chartered Standard Chartered tiene un grupo grande usando Haskell para todos los aspectos de su negocio de banca mayorista. Starling Software Tokio, Japón Starling Software está desarrollando un sistema comercial comercial de opciones automatizado en Haskell, y está migrando otras partes de su suite de software a Haskell. Starling Software039s experiencia de construcción de sistemas de comercio en tiempo real en HaskellSensor Sense Nijmegen, Países Bajos Sensor Sense está ofreciendo sistemas de alta tecnología para las mediciones de gas en la ppbv hasta la gama pptv. Usamos Haskell para el software de control embebido de nuestros detectores de gas traza. Para más información vea el anuncio de Senor Sense039s Silk Amsterdam, Países Bajos Silk investiga y desarrolla nuevas maneras de crear y consumir contenido en línea. Su aplicación Silk facilita el filtrado y visualización de grandes cantidades de información. Skedge. me skedge. me es una plataforma de programación en línea que permite a las empresas automatizar completamente el proceso de hacer citas, como visitas a clientes, entrevistas de trabajo y sesiones de tutoría. Suite Solutions Suite Solutions ofrece productos y soluciones en apoyo de grandes conjuntos de documentación técnica basada en DITA para documentación técnica general y otros formatos XML y SGML más especializados para industrias específicas como el sector aeroespacial industria. Muchos de los productos y soluciones de Suite Solutions039, como los productos destacados SuiteHelp y SuiteShare. Están escritas en Haskell. SumAll Nueva York, Nueva York SumAll agrega varios flujos públicos de datos, tales como diversos datos de redes sociales, en analíticas útiles, informes e ideas. Estamos en proceso de reescribir todo nuestro backend de procesamiento de datos en Haskell. Lo que nos atrajo a la lengua es su enfoque disciplinado e intransigente para resolver problemas difíciles y gestionar la complejidad. Realmente creemos que el lenguaje y el ecosistema está listo para el prime time y nos dará una ventaja competitiva en la industria. Tabula Tabula es una compañía privada de semiconductores fabless que desarrolla Dispositivos Lógicos Programables 3-D. Haskell se utiliza para toolchains internos del compilador relacionados con el diseño del hardware. Tsuru Capital Tokio, Japón Tsuru Capital está operando un sistema automatizado de comercio de opciones escrito en Haskell. Tsuru Capital039s HCAR submission Tupil Utrecht, The Netherlands Tupil is a Dutch company that built software for clients, written in Haskell. Tupil used Haskell for the speed in development and resulting software quality. The company is founded by Chris Eidhof and Eelco Lempsink. Currently they build iPhone/iPad applications in Objective-C. Tupil039s experience building commercial web apps in Haskell Wagon San Francisco, California Wagon is a modern SQL editor: a better way for analysts and engineers to write queries, visualize results, and share data amp charts. Were a team of functional programmers writing apps and services in Haskell (and Javascript). We love to teach and learn functional programming our team is humble, hard working, and fun. Read our engineering blog to learn more about our stack. how we combine Haskell, React, and Electron. and what its like working at a Haskell-powered startup. We039re hiring Haskell engineers based in San Francisco, learn more about the roles and our team Weedreporter Page on weedreporter is a news site in the up and coming cannabis industry, featuring news stories from around the world and USA. This includes news stories about legalization and medical Marijuana. The site is built using Haskell and Postgres. Haskell has allowed us to build a site with fast load times. Tybee is an asset trading library which uses stochastic nonlinear optimization techniques. Its design and use is detailed below. It is mostly designed and implemented it as a thought experiment. I do not guarentee that this algorithm or this software will be successful or profitable with any asset. It is to be used at ones own risk (see LICENSE ). It is written in Haskell. Why is it called Tybee Tybee is an island off the coast of Georgia. If you go there, make sure you hit up the Crab Shack. Its awesome. Still working on this. Tybee uses a simple idea. Given an assets history, lets figure out a modifier on the current average price X such that we will buy when the ask price reaches Cur X. then sell when the bid price reaches Cur Y ( Y gt X ) or Cur Z ( Z lt X ) (a stoploss or floor). The optimization objective function will simulate this trading behavior with a given set of inputs (X, Y, Z) using historical asset price data. The optimization function is up for discussion, but is currently slated to be SPSA (implementation ). You can install via cabal (or cabal-dev ) Getting the Source Get the tybee source. Set up a sandbox. The first time through, you need to download and install a ton of dependencies, so hang in there. The cabal-dev command is just a sandboxing wrapper around the cabal command. The - j flag above tells cabal to use all of your CPUs, so even the initial build shouldnt take more than a few minutes. Nota . For the development mode use --flagsdeveloper. Development mode allows you to run tests from ghci easily to allow some good ole TDD. Once youve built the code, you can run the entire test suite in a few seconds. We use the direct executable rather than cabal-dev tests because it doesnt pass through options very well. The RTS - N above tells GHCs runtime system to use all available cores. If you want to explore, the tests program ( dist/build/tests/tests ) accepts a --help option. Pruébalo. Tests From GHCI You can run all the tests from ghci. starts up the REPL. Or you can run a single testTable of Contents So far, weve been talking mostly about high-level concepts. Haskell can also be used for lower-level systems programming. It is quite possible to write programs that interface with the operating system at a low level using Haskell. In this chapter, we are going to attempt something ambitious: a Perl-like language that is valid Haskell, implemented in pure Haskell, that makes shell scripting easy. We are going to implement piping, easy command invocation, and some simple tools to handle tasks that might otherwise be performed with grep or sed. Specialized modules exist for different operating systems. In this chapter, we will use generic OS-independent modules as much as possible. However, we will be focusing on the POSIX environment for much of the chapter. POSIX is a standard for Unix-like operating systems such as Linux, FreeBSD, MacOS X, or Solaris. Windows does not support POSIX by default, but the Cygwin environment provides a POSIX compatibility layer for Windows. Running External Programs It is possible to invoke external commands from Haskell. To do that, we suggest using rawSystem from the System. Cmd module. This will invoke a specified program, with the specified arguments, and return the exit code from that program. You can play with it in ghci . Here, we run the equivalent of the shell command ls - l /usr. rawSystem does not parse arguments from a string or expand wildcards. 43 Instead, it expects every argument to be contained in a list. If you dont want to pass any arguments, you can simply pass an empty list like this: Directory and File Information The System. Directory module contains quite a few functions that can be used to obtain information from the filesystem. You can get a list of files in a directory, rename or delete files, copy files, change the current working directory, or create new directories. System. Directory is portable and works on any platform where GHC itself works. The library reference for System. Directory provides a comprehensive list of the functions available. Lets use ghci to demonstrate a few of them. Most of these functions are straightforward equivalents to C library calls or shell commands. Here we saw commands to change the current working directory and obtain the current working directory from the system. These are similar to the cd and pwd commands in the POSIX shell. getDirectoryContents returns a list for every item in a given directory. Note that on POSIX systems, this list normally includes the special values . and ... You will usually want to filter these out when processing the content of the directory, perhaps like this: For a more detailed discussion of filtering the results of getDirectoryContents. refer to Chapter 8, Efficient file processing, regular expressions, and file name matching . Is the filter (notElem ., ..) part confusing That could got also be written as filter (c - gt not elem c ., ..). The backticks in this case effectively let us pass the second argument to notElem see the section called Infix functions for more information on backticks. You can also query the system about the location of certain directories. This query will ask the underlying operating system for the information. Program Termination Developers often write individual programs to accomplish particular tasks. These individual parts may be combined to accomplish larger tasks. A shell script or another program may execute them. The calling script often needs a way to discover whether the program was able to complete its task successfully. Haskell automatically indicates a non-successful exit whenever a program is aborted by an exception. However, you may need more fine-grained control over the exit code than that. Perhaps you need to return different codes for different types of errors. The System. Exit module provides a way to exit the program and return a specific exit status code to the caller. You can call exitWith ExitSuccess to return a code indicating a successful termination (0 on POSIX systems). Or, you can call something like exitWith (ExitFailure 5). which will return code 5 to the calling program. Dates and Times Everything from file timestamps to business transactions involve dates and times. Haskell provides ways for manipulating dates and times, as well as features for obtaining date and time information from the system. ClockTime and CalendarTime In Haskell, the System. Time module is primarily responsible for date and time handling. It defines two types: ClockTime and CalendarTime. ClockTime is the Haskell version of the traditional POSIX epoch. A ClockTime represents a time relative to midnight the morning of January 1, 1970, UTC. A negative ClockTime represents a number of seconds prior to that date, while a positive number represents a count of seconds after it. ClockTime is convenient for computations. Since it tracks Coordinated Universal Time (UTC), it doesnt have to adjust for local timezones, daylight saving time, or other special cases in time handling. Every day is exactly (60 60 24) or 86,400 seconds 44 . which makes time interval calculations simple. You can, for instance, check the ClockTime at the start of a long task, again at the end, and simply subtract the start time from the end time to determine how much time elapsed. You can then divide by 3600 and display the elapsed time as a count of hours if you wish. ClockTime is ideal for answering questions such as these: How much time has elapsed What will be the ClockTime 14 days ahead of this precise instant When was the file last modified What is the precise time right now These are good uses of ClockTime because they refer to precise, unambiguous moments in time. However, ClockTime is not as easily used for questions such as: Is today Monday What day of the week will May 1 fall on next year What is the current time in my local timezone, taking the potential presence of Daylight Saving Time (DST) into account CalendarTime stores a time the way humans do: with a year, month, day, hour, minute, second, timezone, and DST information. Its easy to convert this into a conveniently-displayable string, or to answer questions about the local time. You can convert between ClockTime and CalendarTime at will. Haskell includes functions to convert a ClockTime to a CalendarTime in the local timezone, or to a CalendarTime representing UTC. Using ClockTime ClockTime is defined in System. Time like this: The first Integer represents the number of seconds since the epoch. The second Integer represents an additional number of picoseconds. Because ClockTime in Haskell uses the unbounded Integer type, it can effectively represent a date range limited only by computational resources. Lets look at some ways to use ClockTime. First, there is the getClockTime function that returns the current time according to the systems clock. If you wait a second and run getClockTime again, youll see it returning an updated time. Notice that the output from this command was a nice-looking string, complete with day-of-week information. Thats due to the Show instance for ClockTime. Lets look at the ClockTime at a lower level: Here we first construct a ClockTime representing the point in time 1000 seconds after midnight on January 1, 1970, UTC. That moment in time is known as the epoch . Depending on your timezone, this moment in time may correspond to the evening of December 31, 1969, in your local timezone. The second example shows us pulling the number of seconds out of the value returned by getClockTime. We can now manipulate it, like so: This will display what the time will be exactly 24 hours from now in your local timezone, since there are 86,400 seconds in 24 hours. Using CalendarTime As its name implies, CalendarTime represents time like we would on a calendar. It has fields for information such as year, month, and day. CalendarTime and its associated types are defined like this: There are a few things about these structures that should be highlighted: ctWDay. ctYDay. and ctTZName are generated by the library functions that create a CalendarTime. but are not used in calculations. If you are creating a CalendarTime by hand, it is not necessary to put accurate values into these fields, unless your later calculations will depend upon them. All of these three types are members of the Eq. Ord. Leer. and Show typeclasses. In addition, Month and Day are declared as members of the Enum and Bounded typeclasses. For more information on these typeclasses, refer to the section called Important Built-In Typeclasses. You can generate CalendarTime values several ways. You could start by converting a ClockTime to a CalendarTime such as this: We used getClockTime to obtain the current ClockTime from the systems clock. Next, toCalendarTime converts the ClockTime to a CalendarTime representing the time in the local timezone. toUTCtime performs a similar conversion, but its result is in the UTC timezone instead of the local timezone. Notice that toCalendarTime is an IO function, but toUTCTime is not. The reason is that toCalendarTime returns a different result depending upon the locally-configured timezone, but toUTCTime will return the exact same result whenever it is passed the same source ClockTime. Its easy to modify a CalendarTime value: In this example, we first took the CalendarTime value from earlier and simply switched its year to 1960. Then, we used toClockTime to convert the unmodified value to a ClockTime. and then the modified value, so you can see the difference. Notice that the modified value shows a negative number of seconds once converted to ClockTime. Thats to be expected, since a ClockTime is an offset from midnight on January 1, 1970, UTC, and this value is in 1960. You can also create CalendarTime values manually: Note that even though January 15, 2010, isnt a Sunday -- and isnt day 0 in the year -- the system was able to process this just fine. In fact, if we convert the value to a ClockTime and then back to a CalendarTime. youll find those fields properly filled in: TimeDiff for ClockTime Because it can be difficult to manage differences between ClockTime values in a human-friendly way, the System. Time module includes a TimeDiff type. TimeDiff can be used, where convenient, to handle these differences. It is defined like this: Functions such as diffClockTimes and addToClockTime take a ClockTime and a TimeDiff and handle the calculations internally by converting to a CalendarTime in UTC, applying the differences, and converting back to a ClockTime. Lets see how it works: We started by generating a ClockTime representing midnight February 5, 2008 in UTC. Note that, unless your timezone is the same as UTC, when this time is printed out on the display, it may show up as the evening of February 4 because it is formatted for your local timezone. Next, we add one month to to it by calling addToClockTime. 2008 is a leap year, but the system handled that properly and we get a result that has the same date and time in March. By using toUTCTime. we can see the effect on this in the original UTC timezone. For a second experiment, we set up a time representing midnight on January 30, 2009 in UTC. 2009 is not a leap year, so we might wonder what will happen when trying to add one month to it. We can see that, since neither February 29 or 30 exist in 2009, we wind up with March 2. Finally, we can see how diffClockTimes turns two ClockTime values into a TimeDiff. though only the seconds and picoseconds are filled in. The normalizeTimeDiff function takes such a TimeDiff and reformats it as a human might expect to see it. File Modification Times Many programs need to find out when particular files were last modified. Programs such as ls or graphical file managers typically display the modification time of files. The System. Directory module contains a cross-platform getModificationTime function. It takes a filename and returns a ClockTime representing the time the file was last modified. For instance: POSIX platforms maintain not just a modification time (known as mtime), but also the time of last read or write access (atime) and the time of last status change (ctime). Since this information is POSIX-specific, the cross-platform System. Directory module does not provide access to it. Instead, you will need to use functions in System. Posix. Files. Here is an example function to do that: Notice that call to getFileStatus. That call maps directly to the C function stat(). Its return value stores a vast assortment of information, including file type, permissions, owner, group, and the three time values were interested in. System. Posix. Files provides various functions, such as accessTime. that extract the information were interested out of the opaque FileStatus type returned by getFileStatus. The functions such as accessTime return data in a POSIX-specific type called EpochTime. which se convert to a ClockTime using the toct function. System. Posix. Files also provides a setFileTimes function to set the atime and mtime for a file. 45 Extended Example: Piping Weve just seen how to invoke external programs. Sometimes we need more control that that. Perhaps we need to obtain the output from those programs, provide input, or even chain together multiple external programs. Piping can help with all of these needs. Piping is often used in shell scripts. When you set up a pipe in the shell, you run multiple programs. The output of the first program is sent to the input of the second. Its output is sent to the third as input, and so on. The last programs output normally goes to the terminal, or it could go to a file. Heres an example session with the POSIX shell to illustrate piping: This command runs three programs, piping data between them. It starts with ls /etc. which outputs a list of all files or directories in /etc. The output of ls is sent as input to grep. We gave grep a regular expression that will cause it to output only the lines that start with m and then contain ap somewhere in the line. Finally, the result of that is sent to tr. We gave tr options to convert everything to uppercase. The output of tr isnt set anywhere in particular, so it is displayed on the screen. In this situation, the shell handles setting up all the pipelines between programs. By using some of the POSIX tools in Haskell, we can accomplish the same thing. Before describing how to do this, we should first warn you that the System. Posix modules expose a very low-level interface to Unix systems. The interfaces can be complex and their interactions can be complex as well, regardless of the programming language you use to access them. The full nature of these low-level interfaces has been the topic of entire books themselves, so in this chapter we will just scratch the surface. Using Pipes for Redirection POSIX defines a function that creates a pipe. This function returns two file descriptors (FDs), which are similar in concept to a Haskell Handle. One FD is the reading end of the pipe, and the other is the writing end. Anything that is written to the writing end can be read by the reading end. The data is shoved through a pipe. In Haskell, you call createPipe to access this interface. Having a pipe is the first step to being able to pipe data between external programs. We must also be able to redirect the output of a program to a pipe, and the input of another program from a pipe. The Haskell function dupTo accomplishes this. It takes a FD and makes a copy of it at another FD number. POSIX FDs for standard input, standard output, and standard error have the predefined FD numbers of 0, 1, and 2, respectively. By renumbering an endpoint of a pipe to one of those numbers, we effectively can cause programs to have their input or output redirected. There is another piece of the puzzle, however. We cant just use dupTo before a call such as rawSystem because this would mess up the standard input or output of our main Haskell process. Moreover, rawSystem blocks until the invoked program executes, leaving us no way to start multiple processes running in parallel. To make this happen, we must use forkProcess. This is a very special function. It actually makes a copy of the currently-running program and you wind up with two copies of the program running at the same time. Haskells forkProcess function takes a function to execute in the new process (known as the child). We have that function call dupTo. After it has done that, it calls executeFile to actually invoke the command. This is also a special function: if all goes well, it never returns . Thats because executeFile replaces the running process with a different program. Eventually, the original Haskell process will call getProcessStatus to wait for the child processes to terminate and learn of their exit codes. Whenever you run a command on POSIX systems, whether youve just typed ls on the command line or used rawSystem in Haskell, under the hood, forkProcess. executeFile. and getProcessStatus (or their C equivalents) are always being used. To set up pipes, we are duplicating the process that the system uses to start up programs, and adding a few steps involving piping and redirection along the way. There are a few other housekeeping things we must be careful about. When you call forkProcess. just about everything about your program is cloned 46 That includes the set of open file descriptors (handles). Programs detect when theyre done receiving input from a pipe by checking the end-of-file indicator. When the process at the writing end of a pipe closes the pipe, the process at the reading end will receive an end-of-file indication. However, if the writing file descriptor exists in more than one process, the end-of-file indicator wont be sent until all processes have closed that particular FD. Therefore, we must keep track of which FDs are opened so we can close them all in the child processes. We must also close the child ends of the pipes in the parent process as soon as possible. Here is an initial implementation of a system of piping in Haskell. Lets experiment with this in ghci a bit before looking at how it works. We start by running a simple command, pwd. which just prints the name of the current working directory. We pass for the list of arguments, because pwd doesnt need any arguments. Due to the typeclasses used, Haskell cant infer the type of . so we specifically mention that its a String. Then we get into more complex commands. We run ls. sending it through grep. At the end, we set up a pipe to run the exact same command that we ran via a shell-built pipe at the start of this section. Its not yet as pleasant as it was in the shell, but then again our program is still relatively simple when compared to the shell. Lets look at the program. The very first line has a special OPTIONSGHC clause. This is the same as passing - fglasgow-exts to ghc or ghci . We are using a GHC extension that permits us to use a (String, String) type as an instance of a typeclass. 47 By putting it in the source file, we dont have to remember to specify it every time we use this module. After the import lines, we define a few types. First, we define type SysCommand (String, String) as an alias. This is the type a command to be executed by the system will take. We used data of this type for each command in the example execution above. The CommandResult type represents the result from executing a given command, and the CloseFDs type represents the list of FDs that we must close upon forking a new child process. Next, we define a class named CommandLike. This class will be used to run things, where a thing might be a standalone program, a pipe set up between two or more programs, or in the future, even pure Haskell functions. To be a member of this class, only one function -- invoke -- needs to be present for a given type. This will let us use runIO to start either a standalone command or a pipeline. It will also be useful for defining a pipeline, since we may have a whole stack of commands on one or both sides of a given command. Our piping infrastructure is going to use strings as the way of sending data from one process to another. We can take advantage of Haskells support for lazy reading via hGetContents while reading data, and use forkIO to let writing occur in the background. This will work well, although not as fast as connecting the endpoints of two processes directly together. 48 It makes implementation quite simple, however. We need only take care to do nothing that would require the entire String to be buffered, and let Haskells laziness do the rest. Next, we define an instance of CommandLike for SysCommand. We create two pipes: one to use for the new processs standard input, and the other for its standard output. This creates four endpoints, and thus four file descriptors. We add the parent file descriptors to the list of those that must be closed in all children. These would be the write end of the childs standard input, and the read end of the childs standard output. Next, we fork the child process. In the parent, we can then close the file descriptors that correspond to the child. We cant do that before the fork, because then they wouldnt be available to the child. We obtain a handle for the stdinwrite file descriptor, and start a thread via forkIO to write the input data to it. We then define waitfunc. which is the action that the caller will invoke when it is ready to wait for the called process to terminate. Meanwhile, the child uses dupTo. closes the file descriptors it doesnt need, and executes the command. Next, we define some utility functions to manage the list of file descriptors. After that, we define the tools that help set up pipelines. First, we define a new type PipeCommand that has a source and destination. Both the source and destination must be members of CommandLike. We also define the -- convenience operator. Then, we make PipeCommand an instance of CommandLike. Its invoke implementation starts the first command with the given input, obtains its output, and passes that output to the invocation of the second command. It then returns the output of the second command, and causes the getExitStatus function to wait for and check the exit statuses from both commands. We finish by defining runIO. This function establishes the list of FDs that must be closed in the client, starts the command, displays its output, and checks its exit status. Better Piping


No comments:

Post a Comment