jueves, 31 de octubre de 2013

Dreamspark

La gente de Microsoft abrió una nueva pagina, para incentivar el estudio de sus tecnologías; este es uno de sus numerosos intentos. Me gusta que una empresa invierta en conocimiento y capacitación pero creo que microsoft esta invirtiendo demasiado en esto porque la gente del software libre comparte de forma gratuita. Y existen muchísimos manuales de uso de software libre.

A mi parecer Microsoft debería tomar otro camino, dar más importancia a las comunidades e invertir en tecnología libre. Si duda un jefe prefiere invertir en tener una arquitectura toda armada. Pero un desarrollador no, a los desarrolladores nos gusta el código y configurar solo lo que usamos. Por eso me gusta tanto el software open source y Java. Tener verdadera soberanía de la tecnología que usamos es más trabajo. Pero el trabajo es nuestro, es decir hacemos una inversión en nuestra gente.

Dejo link:
https://www.dreamspark.com/

Disfraces de halloween para programadores

No me gusta para nada halloween, pero esta caricatura me hizo reír mucho:




miércoles, 30 de octubre de 2013

Probando Ubuntu 13.10 Saucy Salamander

La verdad es que mi prueba fue como usuario, no como técnico,  no tengo la capacidad de decir si xmir es mejor o peor que tal o cual producto aun que 13.10 no lo use todavía. Opino como usuario, y la verdad estoy muy contento.

El sistema se instalo muy bien con 0 problemas con drivers o otras cosas. Luego apareció la interfaz típica de Unity, con pocas modificaciones a mi entender pero suficientes.

El sistema es estable, pero por alguna razón que tengo que ver se pone lento. (lo reviso y les digo)

Muy aconsejable, si no probaste linux esta podría ser una buena distro para empezar.

Dejo link y fotos:
http://www.ubuntu.com/









Execute LISP Program Online (GNU CLISP 2.49)


Queres probar Lisp y no tenes ganas de instalar cosas? Este sitio es para vos! Nos permite ejecutar lisp de forma online. Probalo y me contas!!

Y no tenes solo Lisp si no otros lenguajes...

Dejo link:
http://www.compileonline.com/execute_lisp_online.php
http://www.compileonline.com/

sábado, 26 de octubre de 2013

7 días para Principles of Reactive Programming

El martes 23 de agosto, postee sobre el nuevo curso que dicta Martin Odersky, por medio de la pagina Coursera; ahora solo faltan 7 días así que si no te inscribiste; estas a tiempo!!



Dejo link:
https://www.coursera.org/course/reactive

jueves, 24 de octubre de 2013

The Functional Database


El amigo Rich Hickey (creador de Clojure) creo una base de datos funcional llamada datomic. Pero que es una base de datos funcional? Lo que nos  promete la programación funcional es mayor orden; mejor consistencia y facilidades en el mantenimiento.

Datomic es una base de datos ACID flexible y adaptable; que se integra de forma natural con Clojure; se puede buscar de forma funcional; por ejemplo una query tiene la siguiente forma:

{:find [variables...] :where [clauses...]}

Si bien tiene una versión de pago; podemos bajarnos su versión gratuita.

Dejo link:
http://www.datomic.com/
http://www.infoq.com/presentations/datomic-functional-database?utm_source=infoq&utm_medium=popular_links_homepage

martes, 22 de octubre de 2013

La revista de The Pragmatic Bookshelf





The Pragmatic Bookshelf es una editorial que me gusta mucho, tiene muy buenos libros de programación. También lanza una revista la cual se puede descargar de forma gratuita. Va por el numero 49 y yo ni enterado :S

Se pueden encontrar muchos temas de interés y artículos sobre java, scala, clojure, elixir, erlang, python, ruby, etc.

Dejo link: http://pragprog.com/magazines

lunes, 21 de octubre de 2013

Infografia sobre Ubuntu

Ubuntu ha hecho grandes cosas en su vida, en esta infografia, muestra un resumen:


sábado, 19 de octubre de 2013

Conociendo ML


ML es un lenguaje funcional desarrollado por Robin Milner en los años 70, no es un lenguaje muy usado pero esta lleno de conceptos que son usados en otros lenguajes.

Vamos por parte, es un lenguaje Funcional por lo tanto las funciones son ciudadanos de primera clase. Y a la vez hace un uso intensivo de recursividad, veamos un ejemplo:

fun fac (0 : int) : int = 1
  | fac (n : int) : int = n * fac (n - 1)

Como pueden ver en el ejemplo es de tipado estático, es decir tenes que poner expresamente el tipo, el compilador no lo infiere.

También tiene listas y las listas son tipadas:

- [];
val it = [] : 'a list
- [1,2,3,4,5]
= ;
val it = [1,2,3,4,5] : int list
- [2,3,"hola"];
stdIn:7.1-7.13 Error: operator and operand don't agree [literal]
  operator domain: int * int list
  operand:         int * string list
  in expression:
    3 :: "hola" :: nil

El error es porque quiero poner elementos de diferente tipo en la misma lista. 

Como la mayoria de los lenguajes funcionales ven una lista como el ultimo elemento y el resto; lo que permite junto a la recursividad hacer cosas muy interesantes:

fun contar (xs : int list) : int =
      if null xs then 0
      else 1 + contar(tl xs)
;
contar([1,2,3,4,5]);

Aclaro que null es una función que nos indica que la lista es vacía, y el algoritmo hace lo siguiente si la lista es vacía devuelve 0, si no devuelve 1 más la cantidad de el resto de los elementos de la lista. Con la función tl obtenemos el resto de la lista, sin el ultimo elemento, veamos otro ejemplo:

fun sumar (xs : int list) : int =
      if null xs then 0
      else hd xs + sumar(tl xs)
;
sumar([1,2,3,4,5]);

Con la función hd tomamos el ultimo elemento, es decir que lo que estamos diciendo es que la suma de todos los elementos es igual a la suma del ultimo elemento más la suma de los demás elementos.

Prometo otros posts!

Dejo link:
http://en.wikipedia.org/wiki/ML_(programming_language)


viernes, 18 de octubre de 2013

Cobol está más vivo que nunca: es migrable y transportable


Que lo maten!! grita la gente ...  Hey hey, paren un poco, con este post no intento alimentar el morbo de la gente, ni la lucha entre lenguajes de programación menos que menos apoyar a cobol (que demasiado me hizo sufrir) solo que atraído por una nostalgia vi esta nota y me resulto muy interesante.

"Cobol es un tema importante en el desarrollo de software, es parte de nuestra historia, es parte de nuestro presente y definitivamente será parte de nuestro futuro." Toma tu torta!!

"Si está relacionado, de hecho de las transacciones de negocio que están ejecutando en el mundo financiero un 80% son Cobol, otra cosa es que el front-end sea Java pero detrás está Cobol, así que en Instituciones financieras es importantísimo, pero no es la única industria en la que es importante." Esto me parece bastante discutible pero no soy un estadísta y no tengo datos precisos.

En mi opinión, y solo en mi opinión que que cobol cope los mercados financieros y se use aun demasiado, habla bien de cobol? o habla mal del sector? o habla de una falta de inversión? Entiendo que cambiar grandes sistemas es muy costoso, que lo que funciona no es necesario cambiarlo, pero realmente cobol es mantenible? realmente cobol es el futuro? perdón que lo dude, es solo una opinión.

Dejo link: http://sg.com.mx/buzz/cobol-esta-mas-vivo-que-nunca-es-migrable-y-transportable?utm_content=buffer55a46&utm_source=buffer&utm_medium=twitter&utm_campaign=Buffer

miércoles, 16 de octubre de 2013

Securing Oracle Database 12c: A Technical Primer



Quiero compartir este libro que se puede descargar de forma gratuita sobre la seguridad en Oracle 12c:

http://books.mcgraw-hill.com/ebookdownloads/Oracle12cSecurity/

El software libre es el presente, solo que la gente no lo sabe


Hace tiempo que no coincido tanto con una persona como con Bruce Perens, fundador y primer líder del proyecto Linux Standard Base. Que indica que el  software libre es el presente y como no tiene medios comerciales de publicación, queda en el anonimato.

Les dejo la nota: http://geekye.infonews.com/2013/10/16/tecnologia-103572-el-software-libre-es-el-presente-solo-que-la-gente-no-lo-sabe.php

Feliz Ada Lovelace Day!!


Pero que es Ada Lovelace Day? Es una celebración mundial que recuerda a la primera programadora. No solo celebra por ser programadora sino también por se mujer.

Pero quien fue Ada Lovelace?  según la wikipedia:

Augusta Ada King, Condesa de Lovelace, nacida Augusta Ada Byron, (Londres10 de diciembre de 1815 - Londres27 de noviembre de 1852),1 conocida habitualmente como Ada Lovelace, fue una matemática y escritora británica conocida principalmente por su trabajo sobre la máquina calculadora mecánica de uso general de Charles Babbage, la Máquina analítica. Entre sus notas sobre la máquina se encuentra lo que se reconoce hoy como el primer algoritmo destinado a ser procesado por una máquina. Como consecuencia, se la describe a menudo como la primera programadora de ordenadores.2 3 4
Dedujo y previó la capacidad de los ordenadores para ir más allá de los simples cálculos de números, mientras que otros, incluido el propio Babbage, se centraron únicamente en estas capacidades.5 Su padre fue el conocido poeta Lord Byron.
Lovelace nació el10 de diciembre de 1815 como la única hija legítima del poeta Lord Byron y su esposa la baronesa Anne Isabella Byron. Todos los otros hijos de Lord Byron nacieron fuera del matrimonio.6 Byron se separó de su esposa un mes después del nacimiento de Ada y dejó Inglaterra definitivamente cuatro meses después, falleciendo finalmente por enfermedad durante la Guerra de la Independencia de Grecia cuando Ada contaba con ocho años de edad. La madre de Ada mantuvo el rencor respecto a Lord Byron y promovió el interés de Ada en las matemáticas y la lógica como esfuerzo para apartarla de que desarrollase lo que ella veía como un carácter insano en su padre, pero Ada mantuvo el interés en él a pesar de esto (y tras su muerte fue enterrada junto a él a petición suya).
Ella se refería a sí misma como una científica poetisa y como analista (y metafísica)6 7 Durante su edad adulta temprana, su talento matemático la condujo a una relación y amistad prolongadas con su colega matemático inglés Charles Babbage, y concretamente con la obra de Babbage sobre la máquina analítica. Entre 1842 y 1843, tradujo un artículo del ingeniero militar italiano Luigi Menabreasobre la máquina, que complementó con un amplio conjunto de notas propias, denominadas simplemente Notas. Estas notas contienen lo que se considera como el primer programa de ordenador, esto es, un algoritmo codificado para que una máquina lo procese. Las notas de Lovelace son importantes en la historia de los orígenes de la computación. También desarrolló una visión sobre las capacidades de los ordenadores de ir más allá de unos simples cálculos numéricos mientras que otros, entre ellos el propio Babbage, se concentraron solamente en estas posibilidades.8

Dejo link:
http://metro.co.uk/2013/10/15/ada-lovelace-day-a-celebration-of-the-worlds-first-computer-programmer-4145367/
http://es.wikipedia.org/wiki/Ada_Lovelace

lunes, 14 de octubre de 2013

Primeros pasos en Haskell


Haskell es un lenguaje funcional que les aconsejo que aprendan. Antes que nada vamos a instalar el compilador GHC o Hugs. Yo voy a usar GHC, si usamos una distro basada en Debian, podemos hacer lo  siguiente:

apt-get install ghc6 libghc6-mtl-dev

y si tenemos un RHEL podemos hacer:

yum install ghc6 libghc6-mtl-dev

GHC puede tomar un script Haskell y compilar pero también puede trabajar de modo interactivo; lo que se conoce como RELP. Luego de instalar estos paquete ejecutamos ghci en una consola:

[emanuel@localhost ~]$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 2 +2
4
Prelude> 5 + 5
10
Prelude> 2 * 2
4
Prelude> 5 / 2
2.5
Prelude> True  && False
False
Prelude> 5 == 5
True
Prelude> 5 /= 4
True
Prelude> 5 + "hola"

<interactive>:9:3:
    No instance for (Num [Char])
      arising from a use of `+'
    Possible fix: add an instance declaration for (Num [Char])
    In the expression: 5 + "hola"
    In an equation for `it': it = 5 + "hola"
Prelude>

Como podemos ver podemos utilizar Haskell como calculadora, pero en la ultima linea, que sucedió? El error que fue lanzado fue porque quise sumar 5 de tipo numero con una palabra o String "hola" y como Haskell es de tipado estático, no puede sumar estas cosas. 

También podemos llamar funciones de la siguiente forma:

Prelude> min 3 5
3
Prelude> max 100 100
100
Prelude> max 3000 3 
3000

Como pueden ver el llamado de funciones no necesita los paréntesis como java o C++ o C. 

Por este post hemos avanzado bastante, en próximos post vamos a seguir aprendiendo Haskell!

Clojure - Functional Programming for the JVM



Quiero compartir un link muy interesante, sobre Clojure muy completo y útil.

Dejo link: http://java.ociweb.com/mark/clojure/article.html

sábado, 12 de octubre de 2013

Que proyectos Open Source están hechos con Clojure?

Este post es a raíz de una pregunta en stackoverflow que publico el amigo Ivan Pierre en google+, pufff cuanta comunicación.

La pregunta es sencilla, conocen algún proyecto open source que este escrito en Clojure, bueno para aprender más sobre Clojure, y la respuesta fue una buena lista:

  • Clojure: Clojure esta escrito en Clojure por lo tanto cuenta.
  • Compojure: Un Framework web para desarrollo en Clojure.
  • Ring: Es una librería web inspirada en Python's WSGI y Ruby's Rack. 
  • Enlive: Selector basado en CSS.
  • Incanter: Es una plataforma de computación estadística y graficación similar a R. 


Y más!!! 

Developers Bus


Encontré una pagina del Developer Bus, si no tienen idea que es esto les dejo un extracto:

"Bienvenido al Developer Bus!
El Developer Bus es el primer reality para desarrolladores en Latinoamérica, podrás seguir todas las novedades de una forma social y en vivo. ¿Estás listo para demostrar tu talento, diseñar y contribuir al ecosistema de tus PyMES regionales?"

Dejo el link
http://developerbus.withgoogle.com/

jueves, 10 de octubre de 2013

Shibboleth un single-sign in basado en el estándar SAML 2


Vamos por partes, que es un single-sign in? Un single-sign in es un sistema que permite que te autentique una sola vez en todos los sistemas de tu empresa o organización. De esta forma no es necesario logearse cada vez que abrimos un sistema.

Shibbolethes un  single-sign in open source que se apoya en el estándar SAML 2. Pero que es SAML 2? primero que todo es un estándar realizado por la organización OASIS que quiso tomar las mejores características de los mensajes de comunicación de single-sign in y formar uno que englobe a todos. Por lo tanto SAML no es más que XML estandarizado.

Porque esta bueno que un single-sign in use estándares? Porque se tiene que integrar con infinidad de sistemas, por lo tanto si existe un estándar todos los sistemas implementan este estándar solo una vez y pueden comunicarse con cualquier single-sign in.

Shibbolethes es tecnología open source, que provee muchas formas de autenticarse. Se basa en autenticación web.

Dejo el link:
http://shibboleth.net

miércoles, 9 de octubre de 2013

lunes, 7 de octubre de 2013

Toad World


Si no conocen "El Toad" es porque no han trabajado mucho con Oracle... Esta misma empresa quiere hacer comunidad, y nos presenta  un sitio muy recomendable, Toad World. En el cual podemos descargarnos un montón freeware muy útil,la joyita es la ide para Big data (Toad for Cloud Database), que nos permite conectarnos con Hadoop, tanto a la base Hive como a HBase.

Dejo link: www.toadworld.com

domingo, 6 de octubre de 2013

Buscar documentación en Clojure

Similar que la función help de python, en clojure existe doc, con esta función podemos ver documentación de otra función, como por ejemplo:

=> (doc str)
-------------------------
clojure.core/str
([] [x] [x & ys])
  With no args, returns the empty string. With one arg x, returns
  x.toString().  (str nil) returns the empty string. With more than
  one arg, returns the concatenation of the str values of the args.
nil

Por supuesto que doc muestra lo que esta documentado de la función, no hace magia, si no documentamos nuestras funciones doc no puede mostrar nada.

Otras veces no sabemos que función utilizar y para esos casos esta find-doc que pasandole una expresión regular busca las funciones que se le parecen:

=> (find-doc "reduce")
-------------------------
clojure.core/areduce
([a idx ret init expr])
Macro
  Reduces an expression across an array a, using an index named idx,
  and return value named ret, initialized to init, setting ret to the
  evaluation of expr at each step, returning ret.
-------------------------
clojure.core/reduce
([f coll] [f val coll])
  f should be a function of 2 arguments. If val is not supplied,
  returns the result of applying f to the first 2 items in coll, then
  applying f to that result and the 3rd item, etc. If coll contains no
  items, f must accept no arguments as well, and reduce returns the
  result of calling f with no arguments.  If coll has only 1 item, it
  is returned and f is not called.  If val is supplied, returns the
  result of applying f to val and the first item in coll, then
  applying f to that result and the 2nd item, etc. If coll contains no
  items, returns val and f is not called.
-------------------------
...
nil



Importar librerias en clojure


Clojure se organiza en namespaces que son similares a los paquetes de java.
Tenemos diferentes formas de importar librerías o paquetes:
  • Require, de esta forma le indicamos a Clojure que necesitamos una librería  Clojure va a verificar que esta este en el classpath, se usa de la siguiente manera: 
(require 'com.mi.libreria)
  • Refer, con refer hacemos es que no tengamos que escribir todo el nombre de la librería. Solo usamos las funciones que fueron importadas. Lo que hacemos con refer es referenciar un namespace, creando mapeos para todos los nombres al actual namespace:
(refer 'com.mi.libreria)
  • Use, es la aplicación de los 2 anteriores, Clojure se fija que la librería este en el classpath y también no es necesario escribir el nombre librería al llamar una función. Use tiene una bandera llamada reload, con la que le decimos que si importo ya una librería  que la recargue si esta librería tuvo un cambio, se actualizara.
(use 'com.mi.libreria)

Veamos un ejemplo:
(use 'examples.introduction)
->nil
(take 10 fibs)
->(0 1 1 2 3 5 8 13 21 34)

viernes, 4 de octubre de 2013

Firefox OS

El mercado de los moviles esta que arde, todos se quieren quedar con algo de la torta, un producto que esta ganando adeptos es Firefox OS. Que nos ofrece mira esta infografia:

miércoles, 2 de octubre de 2013

Jtype, dando tipos a javascript



Tal vez se acuerdan de TypeScript, era un framework javascript para dar tipos a Javascript,  este framework esta impulsado por microsoft. Jtype tiene la misma idea, llevar javascript al mundo de las clases, con herencia y todo lo que ya conocemos.




Basta de chacharas y veamos un ejemplo:
// get the precompiled person class
var cachedPerson = localStorage.getItem('Person');

// compile the person class
var Person = $$(cachedPerson ? cachedPerson : '', function($fName, $lName, $age)
{
    // set the readonly fields (cast the string arguments)
    this.firstName = $$.asString($fName);
    this.lastName  = $$.asString($lName);

    // set the protected field (cast the number arguments)
    this._age = $$.asInt($age);
},
{
    'public readonly firstName': '',
    'public readonly lastName': '',

    'protected _age': 0,

    'public getFullName': function()
    {
        // return the concatenated full name
        return this.firstName + ' ' + this.lastName;
    },

    'public virtual triggerOneYearOlder': function()
    {
        // increment the protected field
        this._age++;
    },

    'public age':
    {
        'get': function()
        {
            // return the protected field
            return this._age;
        },
        'set': function($v)
        {
            // if the incoming property value is valid, set the protected field
            if ($v > 0)
                this._age = $v;
        }
    }
});

// if the person class was not cached, store a local copy of the precompiled export string
if (!cachedPerson)
    localStorage.setItem('Person', $$.export(Person));

// get the precompiled employee class
var cachedEmployee = cachedPerson && localStorage.getItem('Employee');

// compile the employee class
var Employee = $$(cachedEmployee ? cachedEmployee : '', Person, function($fName, $lName, $age, $salary)
{
    // call the base constructor
    this.__base($fName, $lName, $age);

    // set the protected salary field
    this._salary = $salary;
},
{
    'protected _salary': 0,

    'public override triggerOneYearOlder': function()
    {
        // increment the protected age field (by calling the base method)
        this.__base.triggerOneYearOlder();

        // increase the salary by three percent
        this._salary *= 1.03;
    },

    'public salary':
    {
        'get': function()
        {
            // return the salary
            return this._salary;
        }
    }
});

// if the employee class was not cached, store a local copy of the precompiled export string
if (!cachedEmployee)
    localStorage.setItem('Employee', $$.export(Employee));

// instantiate a person object
var p = new Person('John', 'Doe', 30);

// check that the values were set
console.log(p.firstName);// John
console.log(p.lastName);// Doe
console.log(p.age);// 30

// get a protected field
console.log(p._age);// undefined

// set a readonly field (throws an exception in debug mode)
//p.firstName = 'Jane'; (uncomment to try it out)

// set an invalid property value
p.age = -40;

// check that the field and property didn't change
console.log(p.firstName);// John
console.log(p.age);// 30

// set a valid property value
p.age = 40;

// check that the property did change
console.log(p.age);// 40

// invoke a method
console.log(p.getFullName());// John Doe

// invoke a virtual method
p.triggerOneYearOlder();

// check that the age was incremented (by the virtual method)
console.log(p.age);// 41

// instantiate an employee object
var e = new Employee(p.firstName, p.lastName, p.age, 75000);

// check that the inherited values were set
console.log(e.firstName);// John
console.log(e.lastName);// Doe
console.log(e.age);// 41

// get an inherited protected field
console.log(e._age);// undefined

// set an inherited readonly field (throws an exception in debug mode)
//e.firstName = 'Jane'; (uncomment to try it out)

// check that the field didn't change
console.log(e.firstName);// John

// get a declared field (not inherited)
console.log(e.salary);// 75000

// cast the employee object as a person object
e = e.as(Person);

// check the types of both person objects
console.log(p instanceof Person);// true
console.log(p instanceof Employee);// false
console.log(e instanceof Person);// true
console.log(e instanceof Employee);// true

// check that both person objects don't have the derived property
console.log(p.salary);// undefined
console.log(e.salary);// undefined

// invoke an overridden method
e.triggerOneYearOlder();

// cast the person object as an employee object
e = e.as(Employee);

// check that the age was incremented (by the base method)
console.log(e.age);// 42

// check that the salary increased 3% (by the overridden method)
console.log(e.salary);// 77250


Dejo link
:https://github.com/gaulinsoft/jTypes
https://www.facebook.com/JTypes
https://github.com/gaulinsoft/jTypes

martes, 1 de octubre de 2013

Download Free ebook

He recibido de una empresa llamada Attune el siguiente mail y lo comparto:

Attune University

Download Free

Download FREE Open Source Intelligence monitoring eBook

ActiveMQ Startup Guide

  • Control over Mule Administration
  • Creating User and Accessing Roles to them
  • Accessing Work Flow From MMC
  • Understanding Application deployment using Mule Management Console
  • Creating Clusters and Deploying Application over them
  • Creating Alert and Email Alerts on Cluster/Server Specific behavior
  • Learning Load Balancing Over Cluster/Server

How to Dividing up Work with Queue in ActiveMQ

  • How to create connection with ActiveMQ JMS broker
  • How to Start ActiveMQ Server
  • How to create Consumer and Producer
  • How to send and receive message through Producer and Consumer

JMS ActiveMQ in MULE

  • How to Configure JMS component in Mule
  • Creating Global ActiveMQ connector
  • Monitoring queue Message using ActiveMQ admin
  • Complete Integration with Simple example
Si te gusta un libro, a bajar!

SugarJ, endulzando Java...


SugarJ el objetivo de SugaJ es hacer más natural escribir código en los lenguajes. Pongamos un ejemplo, si te toca escribir un XML en java, te vas a encontrar que java no fue hecho para eso; pero existen librerías que utilizan mecanismos que hacen más fácil, por ejemplo escribir un XML en java. Lo que pretende hacer SugarJ es agregar azúcar sintético por medio de librarías.

Las librerías que contienen azúcar sintáctico conservan la compatibilidad y auto-aplicabilidad de las librerías convencionales: azúcar sintáctico puede estar compuesta mediante la importación de múltiples librerías,   azúcar sintáctico puede ser utilizado en el desarrollo de una librerías que exporta en sí azúcar sintáctico. De esta forma podremos generar DSL con librerías.

Este framework o libreía no solo existe para Java, también existe SugarHaskell.

Dejo link:
http://www.informatik.uni-marburg.de/~seba/projects/sugarj/