haskell - DatatypeContexts obsoleto en el último GHC: ¿por qué?
deprecated language-extension (3)
Estaba haciendo algo de desarrollo de Haskell y recompuse un código viejo en una nueva versión de GHC:
The Glorious Glasgow Haskell Compilation System, version 7.2.1
Y cuando lo hice, recibí el siguiente error:
Advertencia: -XDatatypeContexts está en desuso: se lo consideró una mala denominación, y se ha eliminado del lenguaje Haskell.
Eso aparece cuando tienes un código en el siguiente formato:
data Ord a => MyType a
= ConstructorOne a
= ConstructorTwo a a
Mi pregunta es: ¿por qué se desactivó esta función en primer lugar y qué se supone que debo hacer para lograr la misma o similar funcionalidad?
En general, aún necesita agregar Ord a
restricción a cualquier función que use su tipo MyType
, y como tal no es tan útil como pueda parecer. Para obtener más información acerca de por qué fueron eliminados, consulte http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts
Está obsoleto porque era un error y ¡en realidad no tenía ninguna funcionalidad útil! Todo lo que hizo fue forzar un grupo de restricciones adicionales en otros lugares. En particular, cuando la coincidencia de patrones en tal tipo, se vería obligado a agregar una restricción, en lugar de (como se podría esperar inicialmente) acceder a un contexto, en base al conocimiento de que uno debe haber estado disponible para construir el valor en primer lugar.
El "reemplazo", que realmente funciona de la otra manera y rastrea los contextos conocidos para usted, es usar declaraciones de estilo GADT en su lugar :
data MyType a where
ConstructorOne :: Ord a => a -> MyType a
ConstructorTwo :: Ord a => a -> a -> MyType a
Las GADT en general también son más flexibles de muchas otras maneras, pero en este caso particular, lo que sucede es que la creación de un valor necesita la restricción Ord
, que luego se lleva junto con el valor y la coincidencia de patrones en el constructor la retira. Por lo tanto, ni siquiera necesita el contexto de las funciones que lo utilizan, porque sabe que en virtud de esperar algo del tipo MyType a
, obtendrá Ord a
restricción de Ord a
con él.
También estaba recibiendo este error. La sugerencia de ntc2 funcionó para mí, excepto que debería ser con una ''t'' pequeña en ''TypeContext'', es decir, cabal install --ghc-option ''-XDatatypeContexts'' <package>