51 votos

DatatypeContexts en Desuso en Última GHC: ¿por Qué?

Yo sólo estaba haciendo algunos Haskell desarrollo y me vuelve a compilar código antiguo en una nueva versión de GHC:

The Glorious Glasgow Haskell Compilation System, version 7.2.1

Y cuando lo hice, recibí el siguiente mensaje de error:

Advertencia: -XDatatypeContexts está en desuso: fue ampliamente considerado como un misfeature, y ha sido eliminado de la Haskell idioma.

Que aparece cuando tienes el código en el siguiente formato:

data Ord a => MyType a
    = ConstructorOne a
    = ConstructorTwo a a

Mi pregunta es: ¿por Qué esta característica obsoleta en el primer lugar y lo que se supone que tengo que hacer para lograr el mismo o uno similar?

76voto

C. A. McCann Puntos 56834

Es obsoleto porque era un misfeature, y en realidad no tienen ninguna funcionalidad útil! Todo lo que hice fue forzar un montón de restricciones adicionales en otros lugares. En particular, cuando la coincidencia de patrones sobre un tipo, que estaría obligado a añadir una restricción, en lugar de (como en un principio cabría esperar) obtener acceso a un contexto, con base en el conocimiento que uno se encuentra disponible para construir el valor en el primer lugar.

La "sustitución", que en realidad funciona de otra manera y pistas de los contextos conocidos para ustedes, es para uso GADT-declaraciones de estilo en su lugar:

data MyType a where
    ConstructorOne :: Ord a => a -> MyType a
    ConstructorTwo :: Ord a => a -> a -> MyType a

GADTs en general son más flexibles en muchas otras formas, pero para este caso en particular lo que sucede es que la creación de un valor de necesidades de la Ord de restricción, que luego es transportada junto con el valor, y la concordancia de patrones en el constructor de la tira de ella hacia fuera. Para que usted incluso no necesita el contexto de las funciones de usarlo, porque usted sabe que por la virtud de esperar algo de tipo MyType a, obtendrá un Ord a de restricción con ella.

7voto

ivanm Puntos 3108

En general, usted todavía tiene que agregar el Ord a restricción a cualquier función que utiliza su MyType tipo, y como tal no es tan útil como parece. Para obtener más información acerca de por qué los quitaron, ver http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

0voto

Paulo Oliva Puntos 101

Yo también estaba recibiendo este error. ntc2 la sugerencia de que funcionó para mí, excepto que debe ser con pequeños 't' en 'TypeContext', es decir, cabal install --ghc-option '-XDatatypeContexts' <package>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X