Tengo problemas para usar elegantemente el sistema de tipos de Haskell. Estoy seguro de que mi problema es común, pero no sé cómo describirlo, excepto en términos específicos de mi programa.Lograr las abstracciones correctas con el sistema de tipos de Haskell
Los conceptos que estoy tratando de representar son:
puntos de datos, cada uno de los cuales lleva una de varias formas, por ejemplo, (id, número de casos, número de controles), (id, número de casos, población)
conjuntos de puntos de datos e información agregada: (conjunto de id., casos totales, controles totales), con funciones para agregar/eliminar puntos (por lo que para cada variedad de punto, hay una variedad correspondiente de conjunto)
que podría tener una clase de tipos de punto y definir cada variedad de punto como su propio tipo. Alternativamente, podría tener un tipo de punto y un constructor de datos diferente para cada variedad. Del mismo modo para los conjuntos de puntos.
que tienen al menos una preocupación cada enfoque:
Con clases de tipo: Evitar el nombre de la función de colisión será molesto. Por ejemplo, ambos tipos de puntos podrían usar una función para extraer "número de casos", pero la clase de tipo no puede requerir esta función porque es posible que otros tipos de puntos no tengan casos.
Sin clases de tipos: Prefiero no exportar los constructores de datos desde, digamos, el módulo de puntos (proporcionando otras funciones más seguras para crear un nuevo valor). Sin los constructores de datos, no podré determinar de qué variedad es un valor de Punto dado.
¿Qué diseño puede ayudar a minimizar estos (y otros) problemas?
¿En qué circunstancias es lo que necesita para tratar los puntos de datos de manera similar? Usted dice que cada formulario necesitará su propia variedad de conjuntos, y que las operaciones como "número de casos" no son universales. –