Pregunta

Si tuviera la posibilidad de tener una aplicación que utilice tanto Haskell y C ++. Lo capas dejarías que Haskell gestionados y qué capas le sea C ++ -? Gestionado

Tiene cualquiera Alguna vez has hecho tal asociación, (seguramente)? ??

(el sitio Haskell dice que es muy fácil porque Haskell tiene un modo en el que se puede compilar en C por GCC)

Al principio creo que me gustaría mantener todas las operaciones de E / S en las capas C ++. Así como la gestión de interfaz gráfica de usuario.

Es una pregunta bastante vago, pero como tengo la intención de aprender Haskell, estaba pensando acerca de cómo delegar algo de trabajo para Haskell-código (que aprendo en realidad codificación), y quiero que elegir alguna parte donde voy a ver Haskell beneficios.

¿Fue útil?

Solución

El beneficio de Haskell es las abstracciones de gran alcance que le permite utilizar. Usted no está pensando en términos de unos y ceros y direcciones y registros pero los cálculos y las propiedades de tipo y continuaciones.

El beneficio de C ++ es la fuerza con que puede optimizar cuando sea necesario. No está pensando en mónadas magnánimos, flechas, la aplicación parcial, y componer funciones puras: con C ++, puede obtener abajo a la derecha hasta la chapa

Hay tensión entre estos dos estados. En su papel “Programación estructurada con las declaraciones go to,” Donald Knuth escribió

  

Me he sentido desde hace mucho tiempo que un talento para la programación consiste en gran parte de la capacidad de cambiar fácilmente de microscópica a vistas macroscópicas de las cosas, es decir, , para cambiar los niveles de abstracción con fluidez.

Saber utilizar Haskell y C ++, sino también cómo y cuándo combinan bien será derribar todo tipo de problemas.

El último gran proyecto en el que escribió que FFI implicó el uso de una biblioteca de modelos de radar de la casa escrita en C. reimplementar habría sido tonto, y expresando la lógica de alto nivel del resto de la aplicación habría sido un dolor. Seguí el “cerebro” de la misma en Haskell y llamé a la biblioteca de C cuando lo necesitaba.

Usted está queriendo hacer esto como un ejercicio, así que recomiendo el mismo enfoque: escribir la inteligencia en Haskell. Grilletes Haskell como esclavo a C ++ probablemente terminará frustrando usted o hacer que se sienta como si estuviera perdido el tiempo. Utilizar cada idioma en que sus puntos fuertes.

Otros consejos

Aquí es como veo las cosas:

  • Los lenguajes funcionales sobresalen en transformar las cosas . Siempre que escriba programas que tengan una entrada y un mapa / filtro / reducirlo, usar construcciones funcionales. ejemplos del mundo real maravilloso donde Haskell En caso de Excel están dadas por las aplicaciones web (que, básicamente, se transforman las cosas almacenadas en una base de datos de páginas web).
  • Idiomas del procedimiento (lenguajes OOP son de procedimiento) sobresalen en los efectos secundarios y la comunicación entre objetos. Son difíciles de utilizar para transformar los datos, pero cada vez que desee hacer la programación del sistema o de la interacción (bidireccional) con los seres humanos (interfaces de usuario de cualquier tipo, incluyendo la programación web del lado del cliente), que hacen el trabajo limpiamente.
  • No obstante, algunos pueden argumentar que las interfaces de usuario deben tener una descripción funcional, Respondo marcos bien establecidas son bastante fáciles de usar con lenguajes de POO que uno de ellos debe utilizar de esta manera. Después de todo, es natural pensar en componentes de IU en términos de objetos y la comunicación entre objetos.
  • IO es sólo una herramienta: cada vez que transformar entrada a la salida, Haskell (o cualquier otro idioma FP) debe hacer el IO. Siempre que se habla de un ser humano, C ++ (lenguaje de programación orientada a objetos o lo que sea) debe hacer el IO.
  • No se preocupan por la velocidad. Cuando se utiliza Haskell para el trabajo correcto, es eficiente. Cuando se utiliza C ++ o Python para el trabajo correcto, es eficiente.

Por lo tanto, digamos que soy fluido en Haskell, C, C ++ y Python, así es como escribo aplicaciones:

  • Si el papel principal de mi solicitud es transformar los datos, lo escribo en Haskell, posiblemente acompañado de algunas partes de bajo nivel escritos en C (que puede, a su vez, llamar a algunas partes de nivel bajo de alta tecnología escritas en C ++, pero 'palo d con C como una interfaz por razones de portabilidad).
  • Si el papel principal de mi solicitud es para interactuar con un usuario, lo escribo en Python (PyQt por ejemplo), y dejar que las rutinas de rendimiento crítico de llamada Python escritas en C ++ (impulso :: pitón es bastante bueno como generador de unión) . También puede tener que llamar subrutinas que transforman o ir a buscar los datos, que será escrito en Haskell.
  • Si tengo que escribir una parte de una aplicación en Haskell, que segregar en una API de C-exigible.
  • A veces, una aplicación de Haskell, que dice las cosas en la parte posterior entrada estándar y escribe en la salida estándar es útil como un submódulo (que se llama con un tenedor / exec, o lo que sea en su plataforma). A veces, un script de shell es el envoltorio adecuado para este tipo de aplicaciones.

Esta respuesta es más una historia que una respuesta completa, pero utiliza una mezcla de Haskell, Python y C ++ para mi tesis en la lingüística computacional, así como varias herramientas Java y C que no he escrito. Me pareció más sencilla de ejecutar todo como un proceso separado, usando Python como un código de adhesión para iniciar el Haskell, C ++ y Java programas.

El C ++ fue un bastante simple apretado bucle, que contó ocurrencias de características. Básicamente todo lo que hizo fue matemáticas y sencilla de E / S. En realidad, las opciones controladas por tener el código de unión Python escribir un encabezado completo de #defines y recompilar. Tipo de hacky, pero funcionó.

El Haskell era todo el procesamiento intermedio: tomar la salida compleja a partir de los diversos C y analizadores Java que utilicé, filtrando datos extraños, y transformándolo el formato simple el código C ++ esperado. Entonces tomé la salida de C ++ y lo transformó en látex de marcas (entre otros formatos).

Esta es un área que se puede esperar de Python para ser fuerte, pero he encontrado que Haskell hace que la manipulación de estructuras complejas más fáciles; Python es probablemente mejor para simples transformaciones de línea a línea, pero yo era cortar y rebanar árboles de análisis sintáctico y me encontré con que me olvidé de los tipos de entrada y salida al escribir código en Python.

Desde que estaba usando Haskell muy parecido a un lenguaje de programación más estructurada, terminé escribiendo unos pocos archivo de E / S de los servicios públicos, pero más allá de eso, el incorporado en las bibliotecas para la manipulación de árbol y lista bastado.

En resumen, si usted tiene un problema como el mío, yo sugeriría C ++ para la parte de memoria limitados, velocidad crítica, Haskell para las transformaciones de alto nivel, y Python para ejecutar todo.

Nunca se han mezclado los dos idiomas, pero su acercamiento siente un poco al revés para mí. Haskell es más apto en operaciones de alto nivel mientras que C ++ puede optimizarse y puede ser más beneficiosa para los bucles apretados y otra el rendimiento del código crítico.

Uno de los mayores beneficios de Haskell es la encapsulación de IO en mónadas. Mientras esta IO no es momento crítico, no veo ninguna razón para hacerlo en C ++.

Para la parte de interfaz gráfica de usuario que probablemente tengan razón. Hay un gran número de bibliotecas de Haskell GUI C ++, pero tiene herramientas poderosas como QtCreator que simplifican las tareas tediosas mucho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top