interfaz grafica user-interface haskell wxhaskell gtk2hs

user interface - grafica - ¿Cuáles son los méritos relativos de wxHaskell y Gtk2HS?



haskell desktop (4)

¿Qué es mejor para desarrollar aplicaciones de GUI con Haskell, wxWidgets (a través de wxHaskell ) o GTK (a través de Gtk2HS )?

¿Cuáles son los pros y los contras de cada uno? ¿Varía según la plataforma a la que se dirige (yo trabajaría principalmente en OS X pero me gustaría que mis programas también funcionen en Linux y Windows)?


Tengo información bastante incompleta, pero como todavía no tienes respuestas, tal vez la información incompleta sea mejor que ninguna.

La pregunta es: ¿el kit de herramientas es solo una envoltura alrededor de la funcionalidad tipo C, o hay una capa adicional que le da al kit de herramientas una API más "tipo Haskell nativo"? Cuando wxHaskell se anunció por primera vez en el taller de Haskell, el desarrollo de la API nativa de Haskell parecía extremadamente prometedor, pero aún estaba incompleto. Parece que todavía se está trabajando en la API "Haskellized" para wxHaskell, mientras que el proyecto Gtk2Hs no menciona este problema en absoluto. Por esa razón, recomendaría a wxHaskell.


[Descargo de responsabilidad: soy un mantenedor de wxHaskell]

Ambos son enlaces de GUI estables y bastante completos, y usted puede elegir cualquiera de los proyectos con confianza. Ambos tienen algún grado de enlaces Haskell de "nivel superior", pero en ambos casos tendrás que recurrir a una codificación de estilo "C" bastante imperativa para hacer las cosas. Mi impresión es que wxHaskell te permite pasar un poco más de tiempo en las vinculaciones de nivel superior, pero no he hecho mucho GTK2HS, y en cualquier caso, definitivamente te encuentras trabajando en el extremo más fino de la envoltura para ambas bibliotecas: y creo que la "complejidad" total de la programación es similar en ambos casos.

Por lo tanto, tomemos la funcionalidad básica como algo dado y concéntrese en las diferencias. Tenga en cuenta que realmente creo que GTK2HS es una excelente pieza de trabajo, y que será feliz si lo elige. La mayoría de lo que digo a continuación es una visión personal de las diferencias, y por qué elijo trabajar conmigo mismo y con wxHaskell.

GTK2HS tiene un equipo más grande trabajando en él, y se lanza más regularmente. wxHaskell no se actualiza con tanta frecuencia, pero el equipo central está activo y hay correcciones de errores regulares, pero con nuevas funcionalidades más importantes que se agregan más lentamente de lo que nos gustaría (todos tenemos trabajos diurnos).

wxHaskell ofrece una apariencia de aplicación nativa verdadera en todas las plataformas compatibles listas para usar. GTK2HS es, por supuesto, nativo de Linux y tiene un tema nativo muy bueno en Windows (es decir, lo suficientemente bueno para satisfacer a todos los pedantes ...), pero tiene una apariencia GTK en OSX, y depende de tener instalado X11. Creo que una biblioteca GTK ''nativa'' de OSX está en desarrollo, pero se considera relativamente inmadura. Una vez que esto sea estable, GTK2HS debería poder beneficiarse fácilmente de la misma apariencia y sensación "parcialmente nativa" (por ejemplo, captura de pantalla de GTK OSX ).

wxHaskell es probablemente un poco más fácil de compilar si no estás en Linux (GTK2HS es más fácil si estás alojado en Linux), pero ambos son bastante complejos de construir, para ser honestos, ya que hay un número significativo de dependencias en ambos casos.

Es un poco más fácil (en mi humilde opinión) distribuir aplicaciones basadas en wxHaskell, simplemente porque tiene menos dependencias de biblioteca. Distribuyo aplicaciones utilizando principalmente InnoSetup en Windows y como paquetes de aplicaciones en OSX. Debo admitir que con solo una pequeña cantidad de trabajo extra, lo mismo podría hacerse con GTK2HS, por lo que este es probablemente el argumento más débil a favor de wxHaskell.

En mi opinión personal, wxHaskell es más amigable con los desarrollos de código cerrado (por ejemplo, comerciales). Este es, por supuesto, el tema de interminables guerras de llama, por lo que solo diré que wxHaskell está bajo la licencia de wxWidgets, lo que sin ambigüedades permite el desarrollo de código cerrado. GTK2HS es LGPL, por lo que deberá consultar a su abogado, aunque debo aclarar que muchas personas y compañías han llegado a la conclusión de que LGPL es compatible con el desarrollo comercial; los abogados de la empresa para la que trabajo han llegado a la conclusión de que no es apropiado para nuestros proyectos.

Creo que si Linux fuera mi principal plataforma de desarrollo y entrega, probablemente usaría GTK2HS. No es, sin embargo: entrego principalmente a Windows con OSX ocasional, y creo que wxHaskell es una mejor opción para estas plataformas, aunque ambas opciones son compatibles con las tres plataformas.

Espero que esto te ayude con tu elección.


Una consideración es que actualmente es un poco más fácil conseguir que wxHaskell trabaje de forma nativa en Mac OS X. GTK2HS depende de GTK, que tiene una implementación usando widgets nativos en Mac OS X, pero esa implementación no es tan sencilla como la implementación de wxWidgets para Mac OS X es.

Por lo tanto, si desea desarrollar código para ejecutar sin X11.app, actualmente está un poco mejor con wxHaskell.

Sin embargo, tenga en cuenta que esto está cambiando rápidamente: http://www.haskell.org/haskellwiki/Gtk2Hs#Using_the_GTK.2B_OS_X_Framework muestra cómo usar GTK2HS con GTK + nativo en Mac OS X.

Una ventaja de GTK2HS es su compatibilidad con GLADE, lo que hace que el desarrollo de la IU simple sea muy rápido. Los combinadores de nivel superior en wxHaskell mitigan la mayor parte de esa ventaja, pero requieren una comprensión más profunda de cómo desea que su interfaz se vea y se comporte, y por lo tanto son más difíciles de usar de manera exploratoria.


Personalmente, buscaría algún tipo de paquete / extensión Reactiva. Parece sentarse con el paradigma mucho más cerca. En lugar de especificar sus elementos gráficos de manera imperativa, puede hacerlo declarativamente. Ejemplo (no representativo de ningún idioma o implementación en particular):

x, y, z :: Int click, buttonclicked :: Bool x = <X coordinate of mouse> y = <Y coordinate of mouse> click = <Whether mouse button is currently being pressed> z = x + y buttonclicked = (x == 10 && y == 10 && click)

Buttonclicked y z se actualizarán automáticamente cada vez que cambien x e y.

Podrías tener alguna lógica en alguna parte que se vea así:

if buttonclicked then <do something> else <do something else>

Todo esto es muy confuso. Solo mire en algunas interfaces reactivas reales