¿En qué se diferencian los conceptos de c++ de las clases de tipo Haskell?


Los conceptos para C++ de los Conceptos TS se han fusionado recientemente en GCC trunk. Los conceptos permiten restringir el código genérico al exigir que los tipos satisfagan las condiciones del concepto ("Comparable", por ejemplo).

Haskell tiene clases de tipo. No estoy tan familiarizado con Haskell. ¿Cómo se relacionan los conceptos y las clases de tipo?

Author: jbcoe, 2015-08-20

2 answers

Los conceptos (definidos por los Conceptos TS) y las clases de tipo están relacionados solo en el sentido de que restringen los conjuntos de tipos que se pueden usar con una función genérica. Más allá de eso, solo puedo pensar en formas en que las dos características difieren.

Debo señalar que no soy un experto de Haskell. Ni mucho menos. Sin embargo, soy un experto en los Conceptos TS (lo escribí y lo implementé para GCC).

  • Los conceptos (y las restricciones) son predicados que determinan si un tipo es miembro de un conjunto. No es necesario declarar explícitamente si un tipo es un modelo de concepto (una instancia de una clase de tipo). Eso está determinado por un conjunto de requisitos y verificado por el compilador. De hecho, los conceptos no le permiten escribir " T es un modelo de C" en absoluto, aunque esto es fácilmente soportado usando varias técnicas de metaprogramación.

  • Los conceptos se pueden usar para restringir argumentos que no sean de tipo, y debido a las funciones constexpr y la metaprogramación de plantillas, exprese prácticamente cualquier restricción que pueda esperar escribir (por ejemplo, una matriz hash cuya extensión debe ser un número primo). No creo que esto sea cierto para las clases de tipo.

  • Los conceptos no forman parte del sistema de tipos. Limitan el uso de declaraciones y, en algunos casos, la deducción de argumentos de plantilla. Las clases de tipos son parte del sistema de tipos y participan en la comprobación de tipos.

  • Los conceptos no admiten comprobación o compilación de tipos modulares. Definiciones de plantillas no se comparan con conceptos, por lo que aún puede obtener errores de tipo tardíos durante la instanciación, pero esto agrega un cierto grado de flexibilidad para los escritores de bibliotecas (por ejemplo, agregar código de depuración a un algoritmo no cambiará la interfaz). Debido a que las clases de tipo son parte del sistema de tipos, los algoritmos genéricos se pueden comprobar y compilar de forma modular.

  • Los Conceptos TS soporta la especialización de algoritmos genéricos y estructuras de datos basadas en el ordenamiento de limitación. No soy en absoluto un experto en Haskell, así que no se si hay un equivalente aquí o no. No puedo encontrar uno.

  • El uso de conceptos nunca agregará costos de tiempo de ejecución. La última vez que miré, las clases de tipo podían imponer la misma sobrecarga de tiempo de ejecución que una llamada a una función virtual, aunque entiendo que Haskell es muy bueno optimizando esas llamadas.

Creo que esas son las principales diferencias al comparar característica (Conceptos TS) a característica (Haskell clases de tipo).

Pero hay una diferencia filosófica subyacente en dos lenguajes't y no es funcional frente a cualquier sabor de C++ que estés escribiendo. Haskell quiere ser modular: ser así tiene muchas propiedades agradables. Las plantillas de C++ se niegan a ser modulares: la búsqueda en tiempo de instanciación permite la optimización basada en tipos sin sobrecarga de tiempo de ejecución. Esta es la razón por la que las bibliotecas genéricas de C++ ofrecen una amplia reutilización y un rendimiento sin igual.

 32
Author: Andrew Sutton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-21 18:50:34

Te puede interesar el siguiente artículo de investigación:

"A comparison of C++ concepts and Haskell type classes", Bernardy et al., WGP 2008. Pdf Más detalles.

Actualización: como un breve resumen del documento: el documento define una asignación precisa entre la terminología para los conceptos de C++ y la terminología para las clases de tipo Haskell y utiliza esta asignación para proporcionar una comparación detallada de características entre los dos.

Su conclusión dice:

De nuestros 27 criterios, resumidos en la tabla 2, 16 son igualmente compatibles en ambos idiomas, y solo uno o dos no son portátiles. Por lo tanto, podemos concluir con seguridad como empezamos - conceptos de C++ y clases de tipo Haskell son muy similares.

Como señala T. C. a continuación, vale la pena señalar que el documento está comparando conceptos de C++0x, no Conceptos TS. No conozco una buena referencia que describa las diferencias.

 11
Author: Dominique Devriese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-21 09:33:08