DatatypeContexts Obsoletos en la última GHC: ¿Por qué?


Estaba haciendo un poco de desarrollo de Haskell y recompilé un 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 error:

Advertencia: -XDatatypeContexts está obsoleto: Fue ampliamente considerado como un error, y ha sido eliminado del lenguaje Haskell.

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

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

Mi pregunta es: ¿Por qué esta característica fue obsoleta en primer lugar y qué soy se supone que hacer en lugar de lograr la misma o similar funcionalidad?

Author: Robert Massaioli, 2011-09-16

3 answers

Está en desuso porque era una característica errónea, y en realidad no tenía ninguna funcionalidad útil! Todo lo que hizo fue forzar un montón 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 uno podría esperar inicialmente) obtener acceso a un contexto, basado en el conocimiento de que uno debe haber estado disponible para construir el valor en primer lugar.

El "reemplazo" , que en realidad funciona al revés 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

Los GADTs en general son más flexibles en muchas otras formas también, pero para este caso particular lo que sucede es que crear un valor necesita la restricción Ord, que luego se lleva junto con el valor, y la coincidencia de patrones en el constructor lo saca de nuevo. Así que ni siquiera necesitas el contexto de las funciones que lo usan, porque sabes que en virtud de esperar algo de tipo MyType a, obtendrá una restricción Ord a con él.

 87
Author: C. A. McCann,
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
2017-05-02 10:31:10

En general, todavía necesita agregar la restricción Ord a a cualquier función que use su tipo MyType, y como tal no es tan útil como puede parecer. Para obtener más información sobre por qué se eliminaron, consulte http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

 8
Author: ivanm,
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
2011-09-15 23:39:09

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

 -1
Author: Paulo,
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
2013-08-14 09:03:51